Retrofit2踩到的一些坑

Retrofit2使用中需要注意的

Posted by JovenHe on May 14, 2019

在使用Retrofit2过程中会遇到一些奇奇怪怪的问题,特此记录一下。

Delete不支持body

在一个删除接口遇到一个异常崩溃报错信息:

IllegalArgumentException: Non-body HTTP method cannot contain @Body.

原因是使用Retrofit2中Delete方法不支持@Body,直接把@DELETE改成这样就好了:

@HTTP(method = "DELETE",path = HttpApi.URL_Quick_Delete,hasBody = true)

onError方法无信息返回

一个接口返回直接走了onError方法,debug后如下:

请求debug.png

使用postman如下

请求.png

在请求返回Status非200时直接走了onError方法,返回数据只有一个Throwable对象,但有时候服务器返回信息里还包含一些重要信息,例如上面图中的msg字段需要toast弹出提示,所以要获取到里面信息,要么让后台返回status为200,通过判断其他字段如success判断成功失败,要么通过以下代码获取异常中的信息:

if (e instanceof HttpException) {
    ResponseBody body = ((HttpException) e).response().errorBody();
    try {
        Log.e(TAG, "onFail---" + bean.getMsg());
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    return;

}

当然,这种问题其实是服务器后台失误,网络请求成功并且需要返回数据,肯定是不能把状态码作为错误处理的。