Android中的网络请求框架,基本是okhttp和Retrofit一统天下,而Retrofit又是以okhttp为基础,所以系统学习okhttp的使用和原理就很有必要了。
okhttp是由square公司开发,Android中公认最好用的网络请求框架,在接口封装上做的简单易用,
它有以下默认特性:
支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
使用连接池减少请求延时
透明的GZIP压缩减少响应数据的大小
缓存响应内容,避免一些完全重复的请求
当网络出现问题的时候OkHttp 会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP。
gradle引入依赖即可。
基本使用步骤如下
构建客户端对象OkHttpClient
构建请求Request
生成Call对象
Call发起请求(同步/异步)
下面跟着具体使用实例,详细介绍
get方式中又可以分为两种情况,分别是和;
同步请求在进行请求的时候,当前线程会阻塞住,直到得到服务器的响应后,后面的代码才会执行;
而异步请求不会阻塞当前线程,它采用了回调的方式,请求是在另一个线程中执行的,不会影响当前的线程。
以百度主页为例,进行Get请求:
2.1.1 同步请求
首先,创建了OkHttpClient实例,接着用Request.Builder构建了Request实例并传入了百度主页的url,然后httpClient.newCall方法传入Request实例生成call,最后在子线程调用call.execute()执行请求获得结果response。
使用OkHttp进行get请求,是比较简单的,只要在构建Request实例时更换url就可以了。
2.1.2 异步请求
call.execute()是同步方法。想要在主线程直接使用可以嘛?当然可以,使用call.enqueue(callback)即可:
call.enqueue会异步执行,需要注意的是,两个回调方法onFailure、onResponse是执行在子线程的,所以如果想要执行UI操作,需要使用Handler或其他方式切换到UI线程。
2.1.3 取消请求
每一个Call只能执行一次。如果想要取消正在执行的请求,可以使用call.cancel(),通常在离开页面时都要取消执行的请求的。
2.1.4 结果处理
请求回调的两个方法是指 传输层 的失败和成功。onFailure通常是connection连接失败或读写超时;onResponse是指成功得从服务器获取到了结果,但是这个结果的响应码可能是404、500等,也可能就是200(response.code()的取值)。
如果response.code()是200,表示应用层请求成功了。此时我们可以获取Response的ResponseBody,这是响应体。从面看到,可以从ResponseBody获取string、byte[ ]、InputStream,这样就可以对结果进行很多操作了,比如UI上展示string(要用Handler切换到UI线程)、通过InputStream写入文件等等。
上面异步请求执行后 结果打印如下:
可见百度首页的get请求成功响应了。
POST请求将参数放在请求的主体中,不会直接显示在URL中。Post请求也分为同步和异步方式,和get方式用法相同,代码如下
2.2.1 同步post
2.2.2 异步post
2.2.3 post请求提交多种格式
2.2.3.1 post请求提交String、文件
post请求与get请求的区别 是在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据,其他都是一样的。示例如下:
对比get请求,把构建Request时的get()改成post(body),并传入RequestBody实例。RequestBody实例是通过create方法创建,需要指定请求体内容类型、请求体内容。这里是传入了一个指定为markdown格式的文本。
传入RequestBody的 MediaType 还可以是其他类型,如客户端要给后台发送json字符串、发送一张图片,那么可以定义为:
2.2.3.2 post请求提交表单
构建RequestBody除了上面的方式,还有它的子类FormBody,FormBody用于提交表单键值对,这种能满足平常开发大部分的需求。
FormBody是通过FormBody.Builder用构建者模式创建,add键值对即可。它的contentType在内部已经指定了。
2.2.3.3 post请求提交复杂请求体
RequestBody另一个子类MultipartBody,用于post请求提交复杂类型的请求体。复杂请求体可以同时包含多种类型的的请求体数据。
上面介绍的 post请求 string、文件、表单,只有单一类型。考虑一种场景–注册场景,用户填写完姓名、电话,同时要上传头像图片,这时注册接口的请求体就需要 接受 表单键值对 以及文件了,那么前面讲的的post就无法满足了。那么就要用到MultipartBody了。 完整代码如下:
其他请求方式像put、header、delete,主要在构建Request时把get()或post()换成put()、header()、delete()就可以了,但一般在Android端很少用到。
先看几个问题:
如何全局设置超时时长?
缓存位置、最大缓存大小 呢?
考虑有这样一个需求,我要监控App通过 OkHttp 发出的 所有 原始请求,以及整个请求所耗费的时间,如何做?
这些问题,在OkHttp这里很简单。把OkHttpClient实例的创建,换成以下方式即可:
这里通过OkHttpClient.Builder通过构建者模式设置了连接、读取、写入的超时时长,用cache()方法传入了由缓存目录、缓存大小构成的Cache实例,这样就解决了前两个问题。
使用addInterceptor()方法添加了Interceptor实例,且重写了intercept方法。Interceptor意为拦截器,intercept()方法会在开始执行请求时调用。其中chain.proceed(request)内部是真正请求的过程,是阻塞操作,执行完后会就会得到请求结果ResponseBody,所以chain.proceed(request)的前后取当前时间,那么就知道整个请求所耗费的时间。上面chain.proceed(request)的前后分别打印的日志和时间,这样第三个问题也解决了。
全局配置的有了,单个请求的也可以有一些单独的配置。
- 使用addHeader()方法添加了请求头。
- 使用cacheControl(CacheControl.FORCE_NETWORK)设置此次请求是能使用网络,不用缓存。(还可以设置只用缓存FORCE_CACHE。)
OkHttp的拦截器(Interceptors)提供了强大的自定义和修改HTTP请求和响应的能力。拦截器允许在发送请求前、收到响应后以及其他阶段对HTTP流量进行拦截和处理。例如:拦截器可以修改请求的URL、请求方法、请求头部、请求体等。这对于添加身份验证头、设置缓存控制头等场景很有用。用法如下:
大家应该有这样的经历,就是有些网站的好多功能都需要用户登录之后才能访问,而这个功能可以用cookie实现,在客户端登录之后,服务器给客户端发送一个cookie,由客户端保存;然后客服端在访问需要登录之后才能访问的功能时,只要携带这个cookie,服务器就可以识别该用户是否登录。用法如下:
实现了单例模式来确保 OkHttpUtils 和 OkHttpClient 实例的唯一性
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
一般支持https的网站,都是CA(Certificate Authority)机构颁发的证书,但是一般该机构颁发的证书需要提供费用且有使用时间的限制,到期需要续费。否则默认该链接是不信任的,通过okHttp无法直接访问。

但是我们可以使用自签的方式,通过JDK自带的keytool.exe 生成一个自己的证书,然后使用该证书内容。虽然也是会出现提示“不安全”,但是我们可以通过okhttp访问链接。
将证书文件放置在assets目录(也可以放置在其他目录下,只要能正确读取到该文件),在创建OkhttpClient对象时sslSocketFactory()将该证书信息添加。
通过以上代码可以看出,通过InputStream方式读取证书信息,因此为了避免将证书文件打包到APK中,我们可以直接将证书文件内容放置在String中,将该字符串转为流的形式。
在使用okhttp时,将其设置到sslSocketFactory中。
通过添加证书的形式,可以实现客户端访问Https服务端的功能,但是如果服务端更换证书内容,那么客户端需要相应的更换https证书,否则无法正常交互获取不到数据,我们可以通过自定义X509TrustManager的形式实现来规避所有的证书检测,实现信任所有证书的目的。
参考链接:
以下是一些OkHttp相关的优秀文章:
网络请求-Android篇(Okhttp和Retrofit)
OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive
OkHttp使用踩坑记录总结(二):OkHttp同步异步请求和连接池线程池
Android网络编程(一)HTTP协议原理
Android okhttp3.0配置https的自签证书和信任所有证书
OkHttp的工作流程分析
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13751.html