记录一种理论上可行的重写okhttp的response的方法

有这样一个需求

要求的json是这样的结构

{
    "data": {},
    "errorCode": 0,
    "errorMsg": ""
}

但实际上是这样一个结构

{
    "data": [],
    "errorCode": 0,
    "errorMsg": ""
}

也就是一个json对象变成了一个json数据

网络是采用okhttp做客户端,retrofit请求,Rxjava做线程调度,响应都是定死了的,就是第一种json结构,否则解析不了,第一个想到的方法是利用okhttp的intercepter拦截器重写Response,写到一半,发现这种方法理论上可行,实际上…

要重写Response,就要构造一个Response,在Response的源码中看到了一个Reponse的构造器

public static class Builder {
    Request request;
    Protocol protocol;
    int code = -1;
    String message;
    @Nullable Handshake handshake;
    Headers.Builder headers;
    ResponseBody body;
    Response networkResponse;
    Response cacheResponse;
    Response priorResponse;
    long sentRequestAtMillis;
    long receivedResponseAtMillis;

    public Builder() {
      headers = new Headers.Builder();
    }

我一看,只要一项一项构造就行了,直到写到…

Response.Builder builder = new Response.Builder()
         .request(response.request())
         .protocol(response.protocol())
         .code(response.code())
         .handshake(response.handshake())
         .headers(response.headers())
         .message(response.message())
         .receivedResponseAtMillis(response.receivedResponseAtMillis())
         .sentRequestAtMillis(response.sentRequestAtMillis())
         .body()

前面的参数都可以用原来Response的,但是body得自己构造

ResponseBody是一个抽象类,只要实现里面的方法就行了

      ResponseBody body = new ResponseBody() {

            @Override
            public MediaType contentType() {
                return null;
            }

            @Override
            public long contentLength() {
                return 0;
            }

            @Override
            public BufferedSource source() {
                return null;
            }
        };

一看还得构造MediaType和BufferedSource,BufferedSource是okio包里面的东西,这么搞下去,绵绵无绝期,该搞到啥时候,反过来一看,我的需求是这么简单,这绝对不是什么优雅的方法,还是想想其他的方法吧.

🌹💗正文结束💗🌹