OKHttp学习笔记1:api

85 阅读2分钟

核心类:OKHttpClient

Request

用于构造请求,RequestRequest.Builder()

  • http header: 由header()addHeader()添加
  • Get请求:默认为get请求,参数拼接到url中
  • Post请求:RequestBody,通过post()方法接收RequestBody
    • String
    • form表单
    • 文件
    • 同时上传表单及文件:MultipartBodyMultipartBody.Builder()

Response

无特殊注意事项,详见api:square.github.io/okhttp/4.x/…

Call

发送构造出的请求,CallOkHttpClient().newCall(request)

  • 同步发送:execute()
  • 异步发送:enqueue(Callback)
  • 取消:cancel()

Cache

缓存响应,CacheOkHttpClient.Builder().cache(Cache)。需指定缓存目录及大小,有几点需注意

  • 缓存目录必须是私有的,只有自己才能读写
  • 每个OkHttpClient实例的缓存目录不能一样,通常来说一个应用内应当只有一个OkHttpClient实例
  • 缓存有效时间根据HTTP首部决定,如 Cache-Control: max-stale=3600

OKHttpClient

超时

  • 连接超时:connectTimeout()
  • 写超时:writeTimeout()
  • 读超时:readTimeout()
  • 请求超时:callTimeout()

Per-call Configuration

OkHttpClient的代理设置、超时和缓存通常是全局的,对所有请求生效,如果想要为单个请求设置特定的参数,可使用OkHttpClient.newBuilder()

Handling authentication

许多HTTP请求需要授权认证,当收到401 Not Authorized的response时,okhttp会自动调用Authenticator

EventListener

用于监听请求过程中的各种事件,详见:square.github.io/okhttp/feat…

拦截器

Interceptor , 关键点是chain.proceed(request),它将请求转发到其他拦截器中。

可以添加若干个拦截器,组成拦截器链,okhttp会按照顺序依次调用他们。

分为应用拦截器和网络拦截器。

Interceptors Diagram

应用拦截器

通过addInterceptor方法添加,new OkHttpClient.Builder().addInterceptor(Interceptor)

  • 重定向和重试等中间response不会传递到应用拦截器中
  • 仅调用一次,无论是真实的网络响应还是缓存的响应
  • 仅需关注应用原始的意图,而不会被okhttp注入的各种首部(如If-None-Match)混淆
  • 允许“短路”,即不调用Chain.proceed()
  • 允许重试并多次调用Chain.proceed()
  • 可以利用withConnectTimeout, withReadTimeout, withWriteTimeout调整调用超时

网络拦截器

通过addNetworkInterceptor方法添加,new OkHttpClient.Builder().addNetworkInterceptor(Interceptor)

  • 能够操作诸如重定向和重试等中间response
  • 不会调用缓存的response(会导致网络被短路)
  • 可以观测到在网络中真实传输的数据
  • 可以访问承载请求的Connection