前言
Retrofit 是目前主流的网络请求框架,相信用过的小伙伴都可能会遇到这样的问题,绝大部分接口测试都正常,就个别接口尤其是返回失败信息时报了个奇怪的错误信息,而看了自己的代码逻辑也没什么问题。那是什么原因呢?是后台返回的数据有误吗?还是自己在处理这些失败数据的时候没考虑仔细呢?
问题原因
后台返回的失败数据不是自己期望的数据格式,比如说,代码中实体bean长这样:
public class BaseResponse<T> {
private boolean success;
private String code;
private String message;
private T data;
}
正常返回正确的情况下,服务器返回的data数据是JSON字符串,T 就很顺利的转换成我们对应的回调实体bean;但当正常返回失败的情况下,服务器的回调可能就长这样:
{
"success": false,
"code":1001,
"message": "登录失败",
"data": []
}
怎么办,这时候我们的程序就会报一个 Net_OnError:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 44 path $.data 这样的JSON解析错误的bug了,皆因服务器返回的 data 是一个空数组,不再是JSON字符串的格式,那么如何解决呢?
解决方案
1.最直接的办法:找后台开发的同事交流沟通一下,把 [] (空数组)或者其他数据类型改成 {} (空JSON字符串)类型,再返回给我们,这时候就可以解决这个JSON解析错误的问题了。
2.自行解决方案:加请求拦截器,在JSON数据解析之前把格式给改了,也可以解决这个问题。
自行解决具体方案
以下是参考 Android 优雅地处理后台返回的骚数据 这篇文章的,实测有效。
(1)写一个抽象请求回调体的拦截器:
public abstract class ResponseBodyInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request();
String url = request.url()