Android同一个接口的同一个字段,在不同的情况下返回不同类型的数据

622 阅读1分钟

今天遇到一个问题,在使用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;
    }
}

感谢帮助: Android使用Retrofit框架时JSON解析出错的解决方案