OKHttp 是一个处理网络请求的开源库,在 Android 和 Java 开发中被广泛使用,以下是它的一些常见用法:
一、添加依赖
如果是 Java 项目使用 Maven 构建,在 pom.xml
文件中添加依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>版本号</version>
</dependency>
二、发起简单的 GET 请求
以下是使用 OKHttp 发起一个简单的 GET 请求的基本步骤及代码示例:
1.创建 OkHttpClient
实例:OkHttpClient
是用于执行网络请求的客户端类,通常创建一个全局的实例即可。
OkHttpClient client = new OkHttpClient();
2.构建请求对象:使用 Request
类构建请求对象,指定请求的 URL
。
Request request = new Request.Builder()
.url("https://www.example.com/api/data")
.build();
3.发起请求并获取响应:通过客户端实例调用 newCall
方法创建一个 Call
对象,然后执行 execute
方法发起同步请求,获取响应。
try {
Call call = client.newCall(request);
Response response = call.execute();
if (response.isSuccessful()) {
String responseBody = response.body().string();
System.out.println("响应内容: " + responseBody);
} else {
System.out.println("请求失败,状态码: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
上述代码中:
- 首先创建
OkHttpClient
实例作为请求客户端。 - 接着构建
Request
对象,指定了请求的目标网址。 - 然后通过客户端发起请求并获取响应,若响应成功(
isSuccessful
判断),则获取响应体内容并输出;若失败,则输出相应的状态码。
需要注意的是,同步请求会阻塞当前线程,一般建议在非 UI 线程(比如 Android 中的子线程)中执行此类操作,避免阻塞主线程导致界面卡顿等问题。
三、发起 POST 请求
发起 POST 请求时,通常需要设置请求体(例如提交表单数据、JSON 数据等),以下是示例代码:
1.创建 OkHttpClient
实例(同 GET 请求步骤):
OkHttpClient client = new OkHttpClient();
2.构建请求对象(包含设置请求体):
假设要提交 JSON 格式的数据,先创建 JSON 格式的请求体,再构建 Request
对象。
MediaType mediaType = MediaType.get("application/json; charset=utf-8");
String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
RequestBody requestBody = RequestBody.create(json, mediaType);
Request request = new Request.Builder()
.url("https://www.example.com/api/submit")
.post(requestBody)
.build();
在上述代码中:
- 首先通过
MediaType
定义了请求体的数据类型为 JSON 格式。 - 然后创建了包含实际数据的
RequestBody
对象。 - 最后构建
Request
对象时,使用post
方法设置请求体,表明这是一个 POST 请求。
发起请求并获取响应(同 GET 请求的响应获取方式类似):
try {
Call call = client.newCall(request);
Response response = call.execute();
if (response.isSuccessful()) {
String responseBody = response.body().string();
System.out.println("响应内容: " + responseBody);
} else {
System.out.println("请求失败,状态码: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
四、异步请求
为了避免阻塞线程,更常用的是异步请求方式,以下是使用 OKHttp 进行异步请求的示例代码:
1.创建 OkHttpClient
实例(同前面步骤):
OkHttpClient client = new OkHttpClient();
2.构建请求对象(同前面相应请求类型的构建方式):
例如构建一个 GET 请求对象:
Request request = new Request.Builder()
.url("https://www.example.com/api/data")
.build();
3.发起异步请求:
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 请求失败时的回调处理
System.out.println("请求失败: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String responseBody = response.body().string();
// 在异步回调中对成功响应进行处理,比如更新UI(在Android中需切换到主线程处理UI更新)
System.out.println("响应内容: " + responseBody);
} else {
System.out.println("请求失败,状态码: " + response.code());
}
}
});
在异步请求中,通过 enqueue
方法将请求加入队列并异步执行,当请求完成后会根据成功或失败分别调用 onResponse
或 onFailure
回调方法,方便在其中进行相应的后续处理。
五、设置请求头
可以在构建请求对象时设置请求头信息,例如设置用户代理(User-Agent
)等常见的请求头,以下是示例代码:
Request request = new Request.Builder()
.url("https://www.example.com/api/data")
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
.build();
通过多次调用 header
方法可以添加多个不同的请求头字段及对应的值,以满足不同的请求需求和服务器要求。
六、处理连接超时等配置
可以对 OkHttpClient
进行一些配置,比如设置连接超时时间、读取超时时间、写入超时时间等,示例代码如下:
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
在上述代码中,使用 OkHttpClient.Builder
来构建客户端实例,并通过相应的方法设置了连接、读取、写入的超时时间都为 10 秒,这样可以避免因为网络问题导致请求长时间阻塞等情况发生。