okhttp

作者: 壹零二肆 | 来源:发表于2020-09-07 19:43 被阅读0次

https://square.github.io/okhttp/
https://github.com/square/okhttp/

0 概述

okhttp是一个现代的网络请求框架

  • Http/2 支持 所有访问同一个主机的Request都共用一个socket

  • connection pool 连接池 减少请求延迟

  • GZIP 压缩数据,减少传输所用的带宽

  • Response Cache 避免重复性的Request


1 使用

Get

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

Post

public static final MediaType JSON
    = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

Async

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Call call, IOException e) {
        e.printStackTrace();
      }

      @Override public void onResponse(Call call, Response response) throws IOException {
        try (ResponseBody responseBody = response.body()) {
          if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

          Headers responseHeaders = response.headers();
          for (int i = 0, size = responseHeaders.size(); i < size; i++) {
            System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
          }

          System.out.println(responseBody.string());
        }
      }
    });
  }

2 源码

2.0 请求过程

请求 异步

2.1 OkHttpClient

  • dispatcher

  • interceptors

  • networkInterceptors

  • connectionPool

  • proxy

  • newCall()

2.2 Call

  • Response execute()

  • enqueue(Callback responseCallback)

2.3 Request

  • url

  • method

  • headers

  • body

  • tag

  • cacheControl

2.4 Response

  • request

  • protocol

  • code

  • message

  • headers

  • body

  • handshake

2.5 RealInterceptorChain

  • interceptors

  • transmitter

  • index

  • request

  • call

  • exchange

2.6 Interceptor

  • Response intercept(Chain chain)

2.7 Cache

  • DiskLruCache cache;

2.8 Connection

  • Route route();

  • Socket socket();

  • Handshake handshake();

  • Protocol protocol();

  • connectSocket

  • source

  • sink

  • connectionPool


3 架构

  • 中间层

    • OKhttp 通过很多中间拦截器来对 Request Response 进行加工

    • 实现了数据的 流式链式处理

  • 生产者

  • 分发器

    • 调度器 通过不同状态的 任务队列 来调度任务
    • readyCalls runningCalls
  • 消费者

  • 缓存

  • 拦截器
    • 类似责任链的效果,链式处理,链式返回

相关文章

网友评论

      本文标题:okhttp

      本文链接:https://www.haomeiwen.com/subject/ilscektx.html