您的位置:首页 > 理论基础 > 计算机网络

Android OkHttp3网络请求框架使用入门

2016-10-18 20:29 543 查看

OkHttp

An HTTP & HTTP/2 client for Android and Java applications.

概述

HTTP是现代应用的网络。这是我们交换数据和媒体的媒介。使用HTTP有效提高加载的速度和节省带宽。

OkHttp是一种更有效率的HTTP客户端:

HTTP/2支持允许发向相同主机的请求分享一个套接字;

连接池减少请求的延迟(如HTTP / 2不可用);

透明的gzip收缩下载大小;

响应缓存避免了重复请求。

概括起来说OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

下载配置

Jar方式:

okhttp-3.4.1.jar

你也需要Okio, okhttp采用其快速I/O和可调整大小的缓冲区。Okio的最新Jar下载.

Maven方式:

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.4.1</version>
</dependency>


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 {
}
});


(完毕)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 框架 okhttp 网络