okhttp——1.基本使用及概要
okhttp基本使用及概要
特性:
- socket复用 (同一个主机共享一个socket)
- 结果缓存减少重复请求
- 支持透明的gzip压缩
http/https协议栈
创建client
OkHttpClient httpsClient = new OkHttpClient.Builder()
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.connectTimeout(timeOut, TimeUnit.MILLISECONDS)
.readTimeout(timeOut, TimeUnit.MILLISECONDS)
.build();
上面为基本的okhttp的创建方式,当然还有很多其它的高级点的设置,下面介绍几个:
// 业务可以自己实现dns接口,okhttp内部有默认实现,无超时逻辑,可能出现dns解析几十秒的问题(dns为树形结构如果查询不到则会逐级查询直到根域名服务器,整个过程非常耗时。出现过一个bug当解析ip+端口号的错误域名时耗时可以达几十秒级别)
// 所以建议自己实现dns接口,设置一个超时时间
public Builder dns(Dns dns)
// 域名校验接口(只有https需要设置,在ssl握手阶段,如果url域名与服务器的域名不匹配时,会交给HostnameVerifier接口判断是否进行连接)
public Builder hostnameVerifier(HostnameVerifier hostnameVerifier)
// 可以设置SocketFactory,用于创建Socket
public Builder socketFactory(SocketFactory socketFactory)
// 对于https的连接创建Factory可以用如下方法
public Builder sslSocketFactory(SSLSocketFactory sslSocketFactory)
// 是否支持重定向,默认为支持
Builder followRedirects(boolean followRedirects)
// 连接失败后是否重连: 默认在 特定场景下回重连(如一个host有多个ip,一个ip失败会尝试另一个)
public Builder retryOnConnectionFailure(boolean retryOnConnectionFailure)
// 添加网络拦截器
Builder addNetworkInterceptor(Interceptor interceptor)
// 请求拦截器
Builder addInterceptor(Interceptor interceptor)
// 用于监控请求的每个阶段,可以做 端到端监控,监控每个接口统计耗时
Builder eventListener(EventListener eventListener)
除以上接口外还可以设置 Dispatch(线程管理)、代理、自定义连接池等,功能很强大
构造请求
请求构造比较简单,具体可参考如下:
Request request = new Request.Builder()
.url(url)
.post(data)
.headers(Headers.of(headerParams))
.build();
同步请求
Response response = client.newCall(request).execute()
异步请求
Response response = client.newCall(request).enqueue(Callback responseCallback)
请求流程
)
// https 中ssl过程
SSLSocketFactory
梦想不是浮躁,而是沉淀和积累