okhttp3 发送post请求
时间: 2025-07-11 17:36:42 浏览: 9
<think>我们正在使用OkHttp3发送POST请求。根据引用[1]和引用[2],我们可以总结出以下步骤:
1. 创建OkHttpClient对象。
2. 构建请求体(RequestBody),对于表单数据,可以使用FormBody;对于JSON,可以使用RequestBody.create()。
3. 构建Request对象,指定URL、请求方法为POST,并设置请求体。
4. 使用OkHttpClient的newCall方法创建Call对象。
5. 执行请求:同步使用execute(),异步使用enqueue()并传入回调Callback。
下面是一个具体的示例,以发送一个表单POST请求为例:
### 同步POST请求(Java示例)
```java
// 1. 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
// 2. 构建表单请求体
RequestBody formBody = new FormBody.Builder()
.add("username", "user1")
.add("password", "pass123")
.build();
// 3. 构建Request对象
Request request = new Request.Builder()
.url("https://example.com/login")
.post(formBody)
.build();
// 4. 创建Call对象并执行同步请求
try (Response response = client.newCall(request).execute()) {
// 检查响应是否成功
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 获取响应体内容
String responseBody = response.body().string();
System.out.println(responseBody);
} catch (IOException e) {
e.printStackTrace();
}
```
### 异步POST请求(Java示例)
```java
// 1. 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
// 2. 构建表单请求体
RequestBody formBody = new FormBody.Builder()
.add("username", "user1")
.add("password", "pass123")
.build();
// 3. 构建Request对象
Request request = new Request.Builder()
.url("https://example.com/login")
.post(formBody)
.build();
// 4. 创建Call对象并执行异步请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try (ResponseBody responseBody = response.body()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 获取响应体内容
String responseData = responseBody.string();
System.out.println(responseData);
}
}
});
```
### 发送JSON数据(Java示例)
如果需要发送JSON数据,可以使用`RequestBody.create()`方法,并指定MediaType为`application/json`。
```java
// 1. 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
// 2. 定义JSON字符串
String json = "{\"username\":\"user1\", \"password\":\"pass123\"}";
// 3. 构建JSON请求体
RequestBody jsonBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8")
);
// 4. 构建Request对象
Request request = new Request.Builder()
.url("https://example.com/login")
.post(jsonBody)
.build();
// 5. 发送请求(同步或异步,同上)
// ... 同步或异步代码
```
### 注意事项
- 在同步请求中,注意在try-with-resources语句中处理Response,以确保资源被正确关闭。
- 在异步请求中,回调方法是在后台线程中执行的,所以如果需要更新UI(在Android中),需要切换到主线程。
- 对于HTTPS请求,如果需要忽略证书验证(仅测试环境),可以参考引用[3]中的配置,但生产环境请使用正规证书。
### 引用说明
以上步骤参考了OkHttp3的基本使用流程[^1][^2],以及关于HTTPS配置的提示[^3]。
§§相关问题§§
1. 如何用OkHttp3发送带文件上传的POST请求?
2. OkHttp3中如何设置请求头(Headers)?
3. 在Android中使用OkHttp3时,如何避免内存泄漏?
4. OkHttp3如何处理重定向和重试?</think>### 使用OkHttp3发送POST请求的方法
#### 1. **基础POST请求(表单数据)**
```java
// 1. 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
// 2. 构建表单请求体
RequestBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
// 3. 创建Request对象
Request request = new Request.Builder()
.url("https://api.example.com/login")
.post(formBody) // 指定POST方法和请求体
.build();
// 4. 发送请求(同步)
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseData = response.body().string();
System.out.println("响应数据: " + responseData);
}
} catch (IOException e) {
e.printStackTrace();
}
```
#### 2. **发送JSON数据**
```java
// 创建JSON请求体
String json = "{\"name\":\"Alice\",\"age\":30}";
RequestBody jsonBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8")
);
Request request = new Request.Builder()
.url("https://api.example.com/users")
.post(jsonBody)
.addHeader("Content-Type", "application/json") // 显式设置JSON头
.build();
// 异步请求示例
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
System.out.println("异步响应: " + response.body().string());
}
}
});
```
#### 3. **高级配置(超时/HTTPS/拦截器)**
```java
// 创建定制化Client(参考引用[3])
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS) // 连接超时
.readTimeout(30, TimeUnit.SECONDS) // 读取超时
.addInterceptor(new Interceptor() { // 拦截器(如添加全局Header)
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request modified = original.newBuilder()
.header("Authorization", "Bearer token")
.build();
return chain.proceed(modified);
}
})
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager) // HTTPS配置
.build();
```
#### 关键点说明:
1. **请求体类型**:
- 表单数据:`FormBody`
- JSON数据:`RequestBody.create()` + `MediaType`
- 文件上传:`MultipartBody`(可添加文件/图片)
2. **同步 vs 异步**:
- 同步:`.execute()`(阻塞当前线程)
- 异步:`.enqueue(callback)`(后台线程执行)
3. **重试机制**:
- 默认包含重定向处理(通过`RetryAndFollowUpInterceptor`实现)[^4]
- 可通过自定义拦截器修改重试逻辑
4. **响应处理**:
- 检查状态码:`response.isSuccessful()`(200-299)
- 获取响应体:`response.body().string()`
- **注意**:响应体只能消费一次,需妥善关闭资源(使用try-with-resources)
> 完整文档参考:[OkHttp官方文档](https://square.github.io/okhttp/)
阅读全文
相关推荐
















