核心类:OKHttpClient
Request
用于构造请求,Request、Request.Builder()
- http header: 由
header()及addHeader()添加 - Get请求:默认为get请求,参数拼接到url中
- Post请求:
RequestBody,通过post()方法接收RequestBody- String
- form表单
- 流
- 文件
- 同时上传表单及文件:
MultipartBody、MultipartBody.Builder()
Response
无特殊注意事项,详见api:square.github.io/okhttp/4.x/…
Call
发送构造出的请求,Call,OkHttpClient().newCall(request)
- 同步发送:
execute() - 异步发送:
enqueue(Callback) - 取消:cancel()
Cache
缓存响应,Cache,OkHttpClient.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会按照顺序依次调用他们。
分为应用拦截器和网络拦截器。
应用拦截器
通过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