今天遇到一个问题,在使用retrofit+okhttp请求的时候,会事先将要返回的数据类型通过泛型的方式传入到框架中。
但是后台的处理方法是:
如果返回成功,那么result会返回约定好的json格式;
如果返回失败,那么result会返回String类型的提示语句; 这就导致在不同情况下,有一种情况会报“解析错误”。
参考了一篇文章,直接解决了我的问题。
public abstract class ResponseBodyInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request();
String url = request.url().toString();
Response response = chain.proceed(request);
ResponseBody responseBody = response.body();
if (responseBody != null) {
long contentLength = responseBody.contentLength();
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE);
Buffer buffer = source.getBuffer();
if ("gzip".equals(response.headers().get("Content-Encoding"))) {
GzipSource gzippedResponseBody = new GzipSource(buffer.clone());
buffer = new Buffer();
buffer.writeAll(gzippedResponseBody);
}
MediaType contentType = responseBody.contentType();
Charset charset;
if (contentType == null || contentType.charset(StandardCharsets.UTF_8) == null) {
charset = StandardCharsets.UTF_8;
} else {
charset = contentType.charset(StandardCharsets.UTF_8);
}
if (charset != null && contentLength != 0L) {
return intercept(response, url, buffer.clone().readString(charset));
}
}
return response;
}
abstract Response intercept(@NotNull Response response, String url, String body);
}
public class HandleErrorInterceptor extends ResponseBodyInterceptor {
@Override
Response intercept(@NotNull Response response, String url, String body) {
Log.w("hao", "拦截器拦到的返回数据:" + body);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(body);
} catch (JSONException e) {
e.printStackTrace();
}
if (jsonObject != null) {
try {
if (!"000000".equals(jsonObject.getString("code"))) {
if (response.body() != null) {
try {
String json = response.body().string().replace("result", "msg");
ResponseBody boy = ResponseBody.create(response.body().contentType(), json);
return response.newBuilder().body(boy).build();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return response;
}
}