Android Retrofit 2.1.0 Response.body()为null,状态代码为404

时间:2018-05-31 09:34:17

标签: android asp.net-web-api retrofit2

我正在尝试调用此api并且因为response.body()返回null而遇到困难。 http://demo.museum.vebrary.vn/api/stuff/getall

我想获取列表的名称并显示给我的recyclerview。

我的模特:

public class SOAnswersResponse {

@SerializedName("StuffModels")
@Expose
private List<StuffModel> stuffModels = null;

public List<StuffModel> getStuffModels() {
    return stuffModels;
}

public void setStuffModels(List<StuffModel> stuffModels) {
    this.stuffModels = stuffModels;
}

public class StuffModel {

@SerializedName("STUFFID")
@Expose
private Integer sTUFFID;
@SerializedName("STUFFCODE")
@Expose
private String sTUFFCODE;
@SerializedName("STUFFNAME")
@Expose
private String sTUFFNAME;
@SerializedName("STUFFNOTE")
@Expose
private String sTUFFNOTE;
@SerializedName("STUFFORDER")
@Expose
private Integer sTUFFORDER;
@SerializedName("CUSTOMERID")
@Expose
private String cUSTOMERID;
@SerializedName("EXHIBITS")
@Expose
private List<Object> eXHIBITS = null;

Json回应

{  
"StuffModels":[  
  {  
     "STUFFID":2,
     "STUFFCODE":"Gi",
     "STUFFNAME":"Giấy",
     "STUFFNOTE":"",
     "STUFFORDER":2,
     "CUSTOMERID":"CAMAU",
     "EXHIBITS":[  

     ]
  },

ApiUtils Class

public class ApiUtils {


private ApiUtils() {
}

public static final String BASE_URL = "http://demo.museum.vebrary.vn/api/";

public static SOService getSOService() {

    return RetrofitClient.getClient(BASE_URL).create(SOService.class);
}
}

服务界面

public interface SOService {

@GET("/stuff/getall")
Call<SOAnswersResponse> getAnswers();
}

RetrofitClient Class

public class RetrofitClient {

private static Retrofit retrofit = null;

public static Retrofit getClient(String baseUrl) {
    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

我的RecyclerView适配器

public class CategogyNameRecyclerViewAdapter extends RecyclerView.Adapter<CategogyNameRecyclerViewAdapter.ViewHolder> {

private List<StuffModel> mItems;
private Context mContext;
private PostItemListener mItemListener;

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    public TextView titleTv;

    PostItemListener mItemListener;

    public ViewHolder(View itemView, PostItemListener postItemListener) {
        super(itemView);
        titleTv = itemView.findViewById(R.id.tvListMenuCategogy);

        this.mItemListener = postItemListener;
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        StuffModel item = getItem(getAdapterPosition());
        this.mItemListener.onPostClick(item.getSTUFFID());

        notifyDataSetChanged();

    }
}

public CategogyNameRecyclerViewAdapter(Context context, List<StuffModel> posts, PostItemListener itemListener) {
    mItems = posts;
    mContext = context;
    mItemListener = itemListener;
}

@Override
public CategogyNameRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    View postView = inflater.inflate(R.layout.item_list_text, parent, false);

    ViewHolder viewHolder = new ViewHolder(postView, this.mItemListener);
    return viewHolder;
}

@Override
public void onBindViewHolder(CategogyNameRecyclerViewAdapter.ViewHolder holder, int position) {

    StuffModel item = mItems.get(position);
    TextView textView = holder.titleTv;
    textView.setText(item.getSTUFFNAME());
}

@Override
public int getItemCount() {
    return mItems.size();
}

public void updateAnswers(List<StuffModel> items) {
    mItems = items;
    notifyDataSetChanged();
}

private StuffModel getItem(int adapterPosition) {
    return mItems.get(adapterPosition);
}

public interface PostItemListener {
    void onPostClick(long id);
}

}

我的主要活动

public class Testttt extends AppCompatActivity {

private CategogyNameRecyclerViewAdapter mAdapter;
private RecyclerView mRecyclerView;
private SOService mService;

@Override
protected void onCreate (Bundle savedInstanceState)  {
    super.onCreate( savedInstanceState );
    setContentView(R.layout.test );

    mService = ApiUtils.getSOService();

    mRecyclerView = (RecyclerView) findViewById(R.id.rcvCategogyNameMenuTest);
    mAdapter = new CategogyNameRecyclerViewAdapter(this, new ArrayList<StuffModel>(0), new CategogyNameRecyclerViewAdapter.PostItemListener() {

        @Override
        public void onPostClick(long id) {
            Toast.makeText(Testttt.this, "Post id is" + id, Toast.LENGTH_SHORT).show();
        }
    });

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.setHasFixedSize(true);
    RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
    mRecyclerView.addItemDecoration(itemDecoration);

    loadAnswers();
}

public void loadAnswers() {


    mService.getAnswers().enqueue(new Callback<SOAnswersResponse>() {
        @Override
        public void onResponse(Call<SOAnswersResponse> call, Response<SOAnswersResponse> response) {
            Toast.makeText(Testttt.this, "333333333333333333"+response.body(), Toast.LENGTH_SHORT).show();
            if(response.isSuccessful()) {
                mAdapter.updateAnswers(response.body().getStuffModels());
                Log.d("AnswersPresenter", "posts loaded from API");
            }else {
                int statusCode  = response.code();

            }
        }

        @Override
        public void onFailure(Call<SOAnswersResponse> call, Throwable t) {
            showErrorMessage();
            Log.d("AnswersPresenter", "error loading from API");

        }
    });
}


public void showErrorMessage() {
    Toast.makeText(this, "Error loading posts", Toast.LENGTH_SHORT).show();
}

}

2 个答案:

答案 0 :(得分:1)

我想到的第一件事是:

public static final String BASE_URL = "http://demo.museum.vebrary.vn/api/";

在结尾处有一个“/”和你的

@GET("/stuff/getall")
Call<SOAnswersResponse> getAnswers();

以“/”开头。所以url中有一个双反斜杠可能导致404代码。这会解决问题吗?

当我调用您的URL时,我会收到XML。可能API未正确配置?

答案 1 :(得分:1)

更改您的服务界面

{{1}}

之所以发生这种情况,是因为您已使用已在基本网址中添加的反斜杠启动