Okhttp3网络请求框架的使用简介
添加Okhttp3的依赖
dependencies {
//Okhttp3 网络请求框架
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
}
在AndroidManifest.xml中声明一下网络权限才行:
<uses-permission android:name="android.permission.INTERNET" />
Okhttp3的使用
1. 异步GET请求
使用步骤:
- new OkHttpClient
- 构造Request对象
- 通过前两步中的对象构建Call对象
- 通过Call.enqueue(Callback)方法来提交异步请求
//请求地址
String url = "http://wwww.bilibili.com";
//创建Okhttp客户端对象
OkHttpClient okHttpClient = new OkHttpClient();
//超时处理
okHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
okHttpClient.setWriteTimeout(10, TimeUnit.SECONDS);
okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);
//创建请求对象并设置对应的参数
final Request request = new Request.Builder()
.url(url)
.get()//默认就是GET请求
.build();
//创建相应的回调对象
Call call = okHttpClient.newCall(request);
//开启网络请求,并处理请求的回调
call.enqueue(new Callback() {
@Override
//请求失败的回调
public void onFailure(Call call, IOException e) {
Log.d(TAG, "请求失败");
}
@Override
//请求成功的回调
public void onResponse(Call call, Response response) throws IOException {
//打印响应的结果
Log.d(TAG, "请求成功: " + response.body().string());
}
});
//可以立即停止掉一个正在执行的call
//call.cancel();
注:
异步发起的请求会被加入到 Dispatcher 中的 runningAsyncCalls双端队列中通过线程池来执行
当call没有必要的时候,使用这个api可以节约网络资源。例如当用户离开一个应用时。不管同步还是异步的call都可以取消
2. 同步GET请求
//请求地址
String url = "http://wwww.bilibili.com";
//创建Okhttp客户端对象
OkHttpClient okHttpClient = new OkHttpClient();
//创建请求对象并设置对应的参数
final Request request = new Request.Builder()
.url(url)
.build();
//创建相应的回调对象
final Call call = okHttpClient.newCall(request);
//创建一个子线程
new Thread(new Runnable() {
@Override
public void run() {
try {
//创建Response对象接收请求的相应并;开启网络请求
Response response = call.execute();
//打印响应的结果
Log.d(TAG, "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
3. POST方式提交String字符串
在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据。在构造 RequestBody 需要指定MediaType,用于描述请求/响应 body 的内容类型
补充: MediaType 的更多信息可以查看 RFC 2045
//请求地址
String url = "https://api.github.com/markdown/raw";
//创建Okhttp客户端对象
OkHttpClient okHttpClient = new OkHttpClient();
//创建MediaType对象
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
//定义要发送个服务端的字符串
String requestBody = "I am Jdqm";
//创建请求对象并设置对应的参数
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(mediaType, requestBody))
.build();
//开启网络请求,并处理请求的回调
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
//请求失败的回调
public void onFailure(Call call, IOException e)