本文总结归纳了OKHttp的使用步骤和使用时的注意事项。
okhttp的介绍:相比于利用API写网络请求,使用okhttp框架可以简化代码量,这是官方对okhttp的解释说明:
HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可使您的内容加载更快并节省带宽。
OkHttp是默认情况下有效的HTTP客户端:
- HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
- 连接池可减少请求延迟(如果HTTP / 2不可用)。
- 透明的GZIP缩小了下载大小
- 应缓存可以完全避免网络重复请求。
当网络出现问题时,OkHttp会坚持不懈:它将从常见的连接问题中静默恢复。如果您的服务具有多个IP地址,则在第一次连接失败时,OkHttp将尝试使用备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。 OkHttp支持现代TLS功能(TLS 1.3,ALPN,证书固定)。可以将其配置为回退以实现广泛的连接。
使用OkHttp很容易。它的请求/响应API具有流畅的构建器和不变性。它支持同步阻塞调用和带有回调的异步调用。
——————————————————————————————————————————————
OKHttp的使用步骤:(以get请求为例)
- 申请网络权限,网络安全配置
- 添加okhttp依赖
- 创建client
- 创建连接,设置请求的内容
- client去发起请求
- 执行任务(同步/异步)
1、申请网络权限,网络安全配置
1.1 申请网络权限
要连接网络都需要去申请网络请求的权限,在manifest中添加:
<uses-permission android:name="android.permission.INTERNET" />
注意: 如果使用的是模拟机,则模拟机也要打开网路,模拟机如何连网
1.2 网络安全配置
在安卓8.0以上(即API 26以上),如果要使用http协议的话需要进行网络安全配置
法一:在manifest中添加该语句:
android:usesCleartextTraffic="true"
法二:新建一个配置文件,设置以下内容,再将配置文件设置到manifest中
network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<domain-config cleartextTrafficPermitted="true">
</domain-config>
</domain-config>
</network-security-config>
manifest:
android:networkSecurityConfig="@xml/network_security_config"
2、添加okhttp依赖
在app下的build.gradle中添加该语句,然后sync一下即可使用okhttp了:
implementation("com.squareup.okhttp3:okhttp:4.5.0")
3、创建client
在使用okhttp时,首先要创建一个client:
此处设置了服务器响应时间
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build(); //build是构建者模式
4、创建连接,设置请求的内容
此处设置了请求方式和URL
Request request = new Request.Builder()
.get() //get方法
.url(BASE_URL + "/get/text")
.build();
5、client去发起请求
把请求任务(request)给client去发起请求,此时就有了一个任务
Call task = okHttpClient.newCall(request);
6、执行任务
此处选择同步/异步的方式执行任务:
同步: 发起请求后等待数据响应完成后在继续其他操作(A -> B -> C)
异步: 发起请求后在等待数据响应的期间可以先执行其他操作(A -> D -> E -> F-> B -> C)推荐使用异步操作
同步:需要创建一个子线程与主线程同步执行操作
new Thread(new Runnable() {
@Override
public void run() {
try {
Response execute = task.execute();
int responseCode = execute.code();
if (responseCode == HttpURLConnection.HTTP_OK) {
//获取到请求头的信息
Headers headers = execute.headers();
for (int i = 0; i < headers.size(); i++) {
String name = headers.name(i);
String value = headers.value(i);
Log.d(TAG, name + " == " + value);
}
InputStream inputStream = execute.body().byteStream();
downloadFile(inputStream, headers);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
异步:
task.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
//失败时
Log.d(TAG, "failure...." + e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//响应时
int code = response.code();
if (code == HttpURLConnection.HTTP_OK) {
ResponseBody body = response.body();
Log.d(TAG, "body is " + body.string()); //此处一定要使用string()方法!
}
Log.d(TAG, "response code is " + code);
}
});
以上就是okhttp发起请求时候的步骤,如果是post请求则在第三步中设置请求内容的时候将.get()改为.post()即可
转载:https://blog.csdn.net/qq_40716430/article/details/105775749