理论上可行的重写okhttp的response的方法

本文探讨了在遇到需要将特定JSON结构转换为另一种结构的需求时,如何理论上通过Okhttp的Interceptor重写Response。虽然可以通过构造新的Response、ResponseBody及其内部元素来实现,但由于涉及众多底层细节,这种方法显得过于复杂且不切实际。作者建议寻找更为简洁的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一种理论上可行的重写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包里面的东西,这么搞下去,绵绵无绝期,该搞到啥时候,反过来一看,我的需求是这么简单,这绝对不是什么优雅的方法,还是想想其他的方法吧.

??正文结束??
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值