OKHttp 里面的Interceptor解析

okhttp 里面有一个类Interceptor主要负责 request的提交 获取response不知道这个是不是拦截器模式。先介绍一下思路:RealCall类里面的下面的方法

Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
  }
}
  1. Interceptor 里有一个chain的接口,chain接口里有 Response proceed(Request request);
    RealInterceptorChain 构造方法里获取拦截器的集合,proceed 方法得到第一个拦截器,再调用interceptor.inercept(Chain chain)
    如果intercept 具体的类里面例如 BrideInterceptor 继续调用 chain.proceed();这将陷入一个来回回调的过程,直到回调完所有的interceptor

  2. 下面通过一个demo来说明这个过程

public class Request {
    private String request;

    public String getRequest() {
        return request;
    }

    public void setRequest(String request) {
        this.request = request;
    }
}


public class Response {
   String response;

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }
}

public interface Interceptor {
    Response intercept(Chain chain);
    interface Chain{
        Response proceed(Request request);
        Request request();
    }
}

//拦截器中处理集合中所有的拦截
public class InterceptorChainConcrete implements Interceptor.Chain {
    List<Interceptor> interceptors;
    int index;
    int calls;
    Request request;
    public InterceptorChainConcrete(List<Interceptor> interceptors, int index,Request req) {
        this.interceptors = interceptors;
        this.index = index;
        this.request = req;
    }

    @Override
    public Response proceed(Request request) {

        Response finish = new Response();
        finish.setResponse("finish");
        if (index >= interceptors.size()) return finish;
        calls++;
        InterceptorChainConcrete next = new InterceptorChainConcrete(
                interceptors,index + 1,request);
        Interceptor interceptor = interceptors.get(index);
        Response res = interceptor.intercept(next);
        res.setResponse(request.getRequest());
        System.out.println("calls:"+calls+" "+request.getRequest()+" index:"+index);
        return res;
    }



    @Override
    public Request request() {
        return request;
    }
}
//拦截器的具体实现类
public class Interceptor1 implements Interceptor {

    @Override
    public Response intercept(Chain chain) {
        InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
        Request request = realChain.request;

        return realChain.proceed(request);
    }
}

public class Interceptor2 implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
        Request request = realChain.request;

        return realChain.proceed(request);
    }
}
//拦截器中最后一个类 终止 回调
public class InterceptorFinish implements Interceptor {
    @Override
    public Response intercept(Chain chain) {

        Response response = new Response();
        response.setResponse("finish");
        return response;
    }
}

测试方法:
  public static com.example.Response Test(){
        List<Interceptor> interceptors = new ArrayList<>();

        interceptors.add(new Interceptor1());
        interceptors.add(new Interceptor2());
        interceptors.add(new InterceptorFinish());
        com.example.Request request = new com.example.Request();
        request.setRequest("request");
       Interceptor.Chain chain = new InterceptorChainConcrete(
                interceptors,  0, request);
        return chain.proceed(request);
    }





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于OkHttp来说,可以通过它提供的ResponseBody来获取服务器返回的JSON数据和图片数据。 1. JSON解析 使用OkHttp获取服务器返回的JSON数据,可以通过如下步骤进行解析: ```java // 1. 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); // 2. 创建Request对象 Request request = new Request.Builder() .url("http://www.example.com/api/get_data") .build(); // 3. 发送请求,获取Response对象 Response response = client.newCall(request).execute(); // 4. 获取ResponseBody对象 ResponseBody body = response.body(); // 5. 获取JSON字符串 String jsonStr = body.string(); // 6. 解析JSON数据 JSONObject jsonObject = new JSONObject(jsonStr); int code = jsonObject.getInt("code"); String message = jsonObject.getString("message"); ``` 以上代码中,我们通过OkHttpClient发送了一个请求,获取了服务器返回的Response对象,然后从Response对象中获取了ResponseBody对象,最后通过ResponseBody对象获取了JSON字符串。接下来,我们就可以使用Android提供的JSONObject或第三方库Gson、FastJson等来解析这个JSON字符串。 2. 图片解析 使用OkHttp获取服务器返回的图片数据,可以通过如下步骤进行解析: ```java // 1. 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); // 2. 创建Request对象 Request request = new Request.Builder() .url("http://www.example.com/images/pic.png") .build(); // 3. 发送请求,获取Response对象 Response response = client.newCall(request).execute(); // 4. 获取ResponseBody对象 ResponseBody body = response.body(); // 5. 获取图片字节数组 byte[] bytes = body.bytes(); // 6. 将字节数组转换为Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); ``` 以上代码中,我们通过OkHttpClient发送了一个请求,获取了服务器返回的Response对象,然后从Response对象中获取了ResponseBody对象,最后通过ResponseBody对象获取了图片字节数组。接下来,我们可以使用Android提供的BitmapFactory将字节数组转换为Bitmap对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值