文章大纲
一、OkHttp简介
二、OkHttp简单使用
三、OkHttp封装
四、项目源码下载
一、OkHttp简介
1. 什么是OkHttp
一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
2. OkHttp优点
(1)支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)
(2)socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数
(3)基于Headers的缓存策略减少重复的网络请求
(4)拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)
3. OkHttp功能
(1)一般的get请求
(2)一般的post请求
(3)基于Http的文件上传
(4)文件下载
(5)上传下载的进度回调
(6)加载图片
(7)支持请求回调,直接返回对象、对象集合
(8)支持session的保持
(9)支持自签名网站https的访问,提供方法设置下证书就行
(10)支持取消某个请求
3. OkHttp使用步骤
(1)get请求的步骤,首先构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。
(2)然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。
(3)最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
(4)onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,
可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
(5)看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等
(6)okHttp还支持GJson的处理方式
(7)okhttp支持同步请求和异步请求,Call call = client.newCall(request);为同步请求,发送请求后,就会进入阻塞状态,知道收到响应call.enqueue(new Callback()为异步请求
(8)在okhttp3.Callback的回调方法里面有个参数是Call 这个call可以单独取消相应的请求,随便在onFailure或者onResponse方法内部执行call.cancel()都可以。如果想取消所有的请求,则可以okhttpclient.dispatcher().cancelAll();
二、OkHttp简单使用
1. 进行get请求
/**
* 原始的get请求
*
* @author 吴晓畅
*
*/
public class OkHttpGet {
public void get() {
//1.okhttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().
//在这里,还可以设置数据缓存等
//设置超时时间
connectTimeout(15, TimeUnit.SECONDS).
readTimeout(20, TimeUnit.SECONDS).
writeTimeout(20, TimeUnit.SECONDS).
//错误重连
retryOnConnectionFailure(true).
build();
//2构造Request,
//builder.get()代表的是get请求,url方法里面放的参数是一个网络地址
Request.Builder builder = new Request.Builder();
Request request = builder.get().url("http://www.baidu.com/").build();
//3将Request封装成call
Call call = okHttpClient.newCall(request);
//4,执行call,这个方法是异步请求数据
call.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, IOException arg1) {
//失败调用
}
@Override
//由于OkHttp在解析response的时候依靠的是response头信息当中的Content-Type字段来判断解码方式
//OkHttp会使用默认的UTF-8编码方式来解码
//这里使用的是异步加载,如果需要使用控件,则在主线程中调用
public void onResponse(Call arg0, Response arg1) throws IOException {
//成功调用
}
});
}
}
2. 进行post请求
/**
* 使用okhttp进行post请求
*
* @author 吴晓畅
*
*/
public class OkHttpPost {
public void initPost() {
//1.okhttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().
//在这里,还可以设置数据缓存等
//设置超时时间
connectTimeout(15, TimeUnit.SECONDS).
readTimeout(20, TimeUnit.SECONDS).