认识OKHttp
- OKHttp介绍
- OKHttp基本配置
- OKHttp基本使用
- 2.X与3
- 代码实例
- 参考内容
OKHttp介绍
OkHttp是一款较为轻量级的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
其中:
内置连接池,支持连接复用,减少延迟。相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。连接池类位于okhttp3.ConnectionPool。
简单了解一下源码,其基本运作逻辑:在put新连接到队列的时候会先执行清理闲置连接的线程,线程中不停调用Cleanup 并返回下次清理的间隔时间。继而进入wait 等待之后释放锁,继续执行下一次的清理。理解为监测时间并释放连接的后台线程。
OKHttp基本配置
- 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
- 导入
MAVEN
<dependency>
<groupId>com.squareup.okhttp3<groupId>
<artifactId>okhttp<artifactId>
<version>3.2.0<version>
<dependency>
GRADLE
compile 'com.squareup.okhttp3:okhttp:3.2.0'
OKHttp基本使用
- GET请求
Request:是用来构建一个请求对象的,符合Http请求的标准,包含了请求头,方法等等属性,较为复杂,因此同样提供Builder模式构建
Response:是用来构建一个响应对象的,包含了响应头,响应码,数据等等属性,同样也提供Builder模式构建
同步和异步请求,都是调用OkHttpClient的newCall方法创建一个RealCall对象,然后通过这个对象,执行请求的
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException
{
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
- 异步GET请求
execute()改为enqueue()方法,并给出回调接口。
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
- POST请求
大作业中就遇到了POST方法提交JSON数据的情景,只需要额外通过RequestBody创建一个消息体。
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static String jsonPost(String url, String json) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
2.X与3
比较一下OKHttp3和2.X的老版本在哪些方面做出了改变,更利于开发人员的编程工作。
- OkHttpClient创建方式不同
okhttp直接new OkHttpClient实例,而okhttp3中提供了Builder,很好的使用了创建者设计模式 - post消息体构建方式不同
okhttp主要使用FormEncodingBuilder构建post消息体,okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,MultipartBody.Builder既可以添加表单数据,也可以添加文件等二进制数据 - Cookie管理
3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。
而2.X的版本使用CookieHandler进行委托管理
/* cookie管理 */
mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
mOkHttpClient.setCookieHandler(mCookieHandler);
代码实例
项目中简单应用的两个方法贴上来,使用的是2.X的版本,涉及到http请求头的Authorization身份验证,POST请求,GET请求
public static String jsonPost(String url, String json) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
public static String authGet(final String url, final String username, final String password) throws IOException {
OkHttpClient client = new OkHttpClient();
String auth = username + ":" + password;
String token = Base64.encodeToString(auth.getBytes(), Base64.DEFAULT);
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", "Basic " + token)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
参考内容
- OKHttp官网:http://square.github.io/okhttp/