OkHttp是一种更有效率的HTTP客户端:
HTTP/2支持允许发向相同主机的请求分享一个套接字; 连接池减少请求的延迟(如HTTP / 2不可用); 透明的gzip收缩下载大小; 响应缓存避免了重复请求。
概括起来说OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
Maven方式:
com.squareup.okhttp3
okhttp
3.4.1
GRADLE方式
compile ‘com.squareup.okhttp3:okhttp:3.4.1’
使用
OkHttp支持同步&异步获得数据
1. 同步get
new Thread(new Runnable() {
@Override
public void run() {
//1. 得到OKHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2. 获取Request对象 ,内部也是通过建造者模式去封装的一些请求参数
Request request = new Request.Builder()
.url(url)
.build();
//3. 获取Call对象
Call call = okHttpClient.newCall(request);
//4. 获取Response对象
try {
Response response = call.execute();
//响应体
ResponseBody body = response.body();
//可以根据自己的需要,返回相应的类型:
//可以返回byte数组, 可以返回 InputStream ,可以返回 字符串
// byte[] bytes = body.bytes();
//InputStream inputStream = body.byteStream();
final String result = body.string(); //注意这里是string()方法,不要写成toString()
// 这个方法执行在主线程当中
// 如果 当前的动作,在主线程中会立即执行
// 如果 当前的动作在子线程中,会先发送到主线程中,然后去执行
runOnUiThread(new Runnable() {
@Override
public void run() {
mTvResult.setText(result);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
2. 异步get
//1. 得到OKHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2. 获取Request对象
Request request = new Request.Builder()
.url(Constant.URL_GET_ASYNC)
.build();
//3. 获取Call对象
Call call = okHttpClient.newCall(request);
//4. 获取Response对象, 通过接口回调方式返回Response
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//TODO 请求失败逻辑在这里处理
//TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//TODO 请求成功时候
//TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK
String result = response.body().string();
}
});
3.同步post
new Thread(new Runnable() {
@Override
public void run() {
//1. 得到OKHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
//2. 得到RequestBody对象,通过FormBody.Builder()来获取,通过add方法提交键值对
RequestBody body = new FormBody.Builder()
.add(“key1”, “value1”)
.add(“key2”, “value2”)
.build();
//3. 创建Request对象
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
//4. 得到Call对象
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
if (response.isSuccessful()) {
final String result = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mTvResult.setText(result);
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
异步post
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add(“key1”, “value1”)
.add(“key2”, “value2”)
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//TODO 失败的,在子线程中
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//TODO 成功时,在子线程中。
}
});
提交json数据
OkHttpClient okHttpClient = new OkHttpClient();
//创建RequetBody对象, 这里注意:不论什么类型的Post请求,只是 RequestBody获取的方式不一样,其他步骤的一模一样
MediaType mediaType = MediaType.parse(“application/json; charset=utf-8”);
RequestBody requestBody = RequestBody.create(mediaType, YOURJSONSTRING);
//获取Request对象
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
//获取Call对象
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});