主流网络框架OkHttp简介与基本用法
一、OkHttp简介
OkHttp是Square公司开源的针对Java和Android程序,封装的一个高性能http请求库。
相比于volley、retrofit、android-async-http封装了具体的请求,线程的切换以及数据转换,OkHttp是基于http协议封装的一套请求客户端,虽然其同样可以开线程,但是根本上它更偏向真正的请求,跟HttpClient和HttpURLConnection的职责是一样的。
OkHttp类似于HttpURLConnection,是基于传输层实现应用层协议的网络框架,而不止是一个http请求应用的库。
二、OkHttp优缺点
OkHttp的优点:
- 支持HTTP/2:HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发,通过在一个连接上。
- 如果HTTP/2不可用,连接池复用技术也可以极大减少延迟。
- 支持GZIP,可以压缩下载体积。
- 响应缓存可以直接避免重复请求。
- 会从很多常用的连接问题中自动恢复。
- 如果服务器配置了多个IP地址,当第一个IP连接失败时,OkHttp会自动尝试下一个IP。
- OkHttp还处理了代理服务器问题和SSL握手失败问题。
此外,由于目前大范围使用的协议为HTTP/1.1,HTTP/2的应用不是很广泛,因此为了应对这个问题,HTTP/1.1引入了Upgrade机制。
另外从Android4.4开始,HttpURLConnection的内部实现已经替换成OkHttp来实现。
OkHttp的缺点:okHttp的回调方法,并不处于UI 线程中,对网络请求结果如果涉及UI 线程的操作,需要使用Handler。可以把它理解成是一个封装之后的类似 HttpUrlConnection 的一个东西,但是你在使用的时候仍然需要自己再做一层封装,这样才能像使用一个框架一样更加顺手。
三、OkHttp进行GET请求
使用OkHttp进行GET请求只需要四步即可完成:
- 获取OkHttpClient对象
- 构造Request对象
- 将Request封装成Call
- 根据需要调用同步或者异步请求方法
需要特别注意是:
同步调用会阻塞主线程,一般不使用。
异步调用中的回调函数是在子线程,并不处于UI线程,这是和Retrofit等网络框架很大区别的地方,因此要对UI进行操作时需要应用到异步消息处理机制(如Handle、AsyncTask等)。
四、OkHttp进行POST
关于POST请求和GET的不同在于Request请求的构造不同,POST方式中的Request需要传递一个RequestBody作为post的参数。RequestBody有两个子类:FormBody和MultipartBody。
- RequestBody——Json数据提交等
使用RequestBody进行POST并提交json字符串的例子如下。
RequestBody通过设置MediaType.get()方法中的类型,能够设置的提交的数据类型有:String、ByteString、byte[]以及File。(此外,由于json可以用String进行提交,因此也能够提交json数据)。 - FormBody——表单数据提交
FormBody是RequestBody的一个子类,其主要用于表单数据的提交,通过设置键值对数据,将其作为post()方法的参数进行提交,即可提交表单数据。
- MultipartBody——复杂请求体*
MultipartBody同样是RequestBody的一个子类,其可以构建与HTML文件上传格式兼容的复杂请求体。
参考资料:OkHttp使用详解
OkHttp的初步使用(get、post之{RequestBody、FormBody、MultipartBody})