多个改造响应和API的错误处理

时间:2016-09-01 13:19:08

标签: json gson retrofit

我正在使用Retrofit和Gson从REST服务中获取数据。它完美无缺,但只有当API没有返回错误时。通常,API返回对象列表(如json),但是当发生错误时,API返回单个错误对象。 我正在尝试获取Call<List<Link>>,但是当API错误发生时,我收到Gson解析错误(Expected BEGIN_OBJECT but was BEGIN_ARRAY)。

我只有一个解决方案:检索单个字符串,然后在enqueue的onResponse()尝试解析响应,但这里有很多样板代码。

有没有更好的解决方案?如何处理API的错误?

1 个答案:

答案 0 :(得分:0)

您可以使用下一个构造:

@Override
public void onResponse(Call<YourModel> call, Response<YourModel> response) {
    if (response.isSuccessful()) {
       // Do awesome stuff
    } else if (response.code == 401) {
       // Handle unauthorized
    } else {
       // Handle other responses
    }
}

完整答案:How to get Retrofit success responce status codes

修改

对于您的情况,您可以使用Call<JsonElement>作为响应类型并在Response:

中解析它
    call.enqueue(new Callback<JsonElement>() {
        @Override
        public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
            if(response.isSuccessful()){
                JsonElement jsonElement = response.body();
                if(jsonElement.isJsonObject()){
                    JsonObject objectWhichYouNeed = jsonElement.getAsJsonObject();
                } 
                // or you can use jsonElement.getAsJsonArray() method
                //use any json deserializer to convert to your class.
            }
            else{
                System.out.println(response.message());
            }
        }
        @Override
        public void onFailure(Call<JsonElement> call, Throwable t) {
            System.out.println("Failed");
        }
    });