为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理 Retrofit 2 中错误的不同模式?

如何处理 Retrofit 2 中错误的不同模式?

四季花海 2022-11-10 16:38:41
我有一个返回以下模式之一的 API:成功(找到数据){    item_count: 83,    items_per_page: 25,    offset: 25,    items: [        { ... },        { ... },        { ... },        ...    ]}失败(未找到数据){    success: false,    error: {        code: 200,        message: "Server is busy"    }}我想使用带有 GSON 的 Retrofit 2 来围绕这个 API 构建一个包装器并转换为 POJO,但是我不确定如何处理 API 可能返回两个完全不同的模式的事实。现在,我有以下课程:public class PaginatedResponse<T> {    private int item_count;    private int items_per_page;    private int offset;    private List<T> items;    public PaginatedResponse<T>(int item_count, int items_per_page, int offset, List<T> items) {        this.item_count = item_count;        this.items_per_page = items_per_page;        this.offset = offset;        this.items = items;    }    public List<T> getItems() {        return this.items;    }}public class Item {    private int id;    private String name;    // ...}然后对于我的 API 接口,我有:public interface API {    @GET("items")    Call<PaginatedResponse<Item>> getItems();}然后最后用这个我试着说:Retrofit retrofit = new Retrofit.Builder()    .baseUrl("http://localhost")    .addConverterFactory(GsonConverterFactory.create())    .build();API api = retrofit.create(API.class);api.getItems().enqueue(new retrofit2.Callback<PaginatedResponse<Broadcast>>() {    @Override    public void onResponse(Call<PaginatedResponse<Broadcast>> call, Response<PaginatedResponse<Broadcast>> response) {        Log.d("SUCCESS", response.body().getItems().toString());    }    @Override    public void onFailure(Call<PaginatedResponse<Broadcast>> call, Throwable t) {        Log.d("FAILURE", t.toString());    }}只要没有抛出错误,这似乎就可以了。但是当抛出错误时,我在 Logcat 中得到以下信息并且我的应用程序崩溃:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference似乎是因为失败的 JSON 缺少一个items属性,它设置List<Item> items为null
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

似乎是因为失败的 JSON 缺少 items 属性,它将 List items 设置为 null


是的。你得到了NullPointerException,因为你调用toString()了一个空对象。这是预期的行为。


解决方案


error由于和具有不同的模式success,因此您需要创建一个具有这两个值的模型。下面给出一个最小的例子,


响应模型.java



class ResponseModel {


    // ERROR

    private final Boolean success;

    private final Error error;


    // SUCCESS

    private final int item_count;

    // more success values... 


    ResponseModel(Boolean success, Error error, int item_count) {

        this.success = success;

        this.error = error;

        this.item_count = item_count;

    }


    public class Error {

        private final int code;

        private final String message;


        private Error(int code, String message) {

            this.code = code;

            this.message = message;

        }


        public int getCode() {

            return code;

        }


        public String getMessage() {

            return message;

        }


    }


    public Boolean getSuccess() {

        return success;

    }


    public Error getError() {

        return error;

    }


    public int getItem_count() {

        return item_count;

    }

}

在onResponse方法中,您可以像这样检查响应是否成功


ResponseModel responseModel = response.body();


if (responseModel.getError() == null) {

    // success

    doSomethingWithSuccess(responseModel.getItem_count())

} else {

    // error

    doSomethingWithError(responseModel.getError())

}



查看完整回答
反对 回复 2022-11-10
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信