start:2020年8月31日
一、前言
一直想学网络框架,这次终于尝到味道了。我先学的简单易懂的OkHttp,感觉用上它之后发送网络请求省事多了,上楼都不累了。将自己目前对OkHttp的理解写成博客,方便以后更深入的学习,同时也提供给需要的人参考。
二、What is OkHttp?
Okhttp是安卓端非常火热的轻量级网络框架,它是一个处理网络请求的开源项目,是由移动支付Square公司贡献的。用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)(度娘提供)
相关网站:OkHttp官网、OkHttp_GitHub
三、增加开发依赖(AS)
在app路径下的 build.gradle配置文件中的 dependencies模块里增加以下代码(记得sync)(最新版本在github查看):
implementation('com.squareup.okhttp3:okhttp:4.8.1')
四、发起请求流程
第一步:创建客户端 -> OkHttpClient
第二步:创建请求对象 -> Request
第三步:创建请求任务 -> Call
第四步:执行请求任务 -> 同步 execute() / 异步 enqueue(Callback)
五、发起Get请求
- 同步请求(代码顺序依次执行):
//创建客户端
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建请求对象
Request request = new Request.Builder()
.get()
.url("https://xxxxx.xx")
.build();
//创建client请求任务
Call callTask = client.newCall(request);
//执行请求任务-同步
Response response = callTask.execute();
if (response.isSuccessful()) {
//请求成功
ResponseBody body = response.body();//拿到响应体
Gson gson = new Gson();//实例化Gson对象
XXXBean xxx = gson.fromJson(body.string(),
XXXBean.class);//通过Gson的fromJson()方法将响应回来的body转换为bean类
//通过Gson将响应body转换为Bean类,然后就方便操作了
} else {
//请求失败
}
- 异步请求(网络请求代码执行后等待响应后继续执行,在等待的时候主代码会继续执行,不会等待响应之后再执行,这就与网络请求代码执行异步了):
//创建客户端
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建请求对象
Request request = new Request.Builder()
.get()
.url("https://xxxxx.xx")
.build();
//创建client请求任务
Call callTask = client.newCall(request);
//执行请求任务-异步
callTask.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d(TAG, "onFailure: " + e.toString());
//请求失败
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();
if (code == HTTP_OK) {
//请求成功
}
});
六、发起Post请求
- 同步请求:
//创建客户端
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建请求对象
MediaType contentType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody requestBody = RequestBody.create(encryptBody, contentType);
Request request = new Request.Builder()
.post(requestBody)
.url("https://xxx.xxx")
.addHeader("device-platform", "android")
.build();
//创建client请求任务
Call callTask = client.newCall(request);
//执行请求任务-同步
Response response = callTask.execute();
if (response.isSuccessful()) {
//请求成功
}
- 异步请求:
//创建客户端
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建请求对象
MediaType contentType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody requestBody = RequestBody.create(encryptBody, contentType);
Request request = new Request.Builder()
.post(requestBody)
.url("https://xxx.xxx")
.addHeader("device-platform", "android")
.build();
//创建client请求任务
Call callTask = client.newCall(request);
//执行请求任务-异步
callTask.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d(TAG, "onFailure: " + e.toString());
//请求失败
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();
if (code == HTTP_OK) {
//请求成功
}
}
});
七、成员介绍
- OkHttpClient 客户端
- Request 请求对象
- Call 执行请求对象
- Gson -> 它是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
- Json -> (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
八、Bean类与Body之间的互换 (Gson的使用)
- ResponseBody -> String -> Bean类
ResponseBody body = response.body();//拿到响应体
Gson gson = new Gson();//实例化Gson对象
XXXBean xxx = gson.fromJson(body.string(), XXXBean.class);//通过Gson的fromJson()方法将响应回来的body转换为bean类
-
Bean类 -> String -> RequestBody
MediaType contentType = MediaType.parse("application/x-www-form-urlencoded");
XXXBean xxx = new XXXBean();
Gson gson = new Gson();
String s = gson.toJson(xxx);
RequestBody requestBody = RequestBody.create(s, contentType);
end:by take