在 Spring Boot 项目中使用 OkHttp 可以方便地进行 HTTP 请求。
在pom.xml文件中添加 OkHttp 的依赖:
<dependencies>
<!-- OkHttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
</dependencies>
以下是一个封装了常见 HTTP 请求方法(GET、POST)的 OkHttp 工具类示例
import okhttp3.*;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* OkHttp 工具类,封装常见的 HTTP 请求方法
*/
public class OkHttpUtils {
private static final OkHttpClient client;
static {
// 初始化 OkHttpClient
client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS) // 连接超时时间
.readTimeout(30, TimeUnit.SECONDS) // 读取超时时间
.writeTimeout(30, TimeUnit.SECONDS) // 写入超时时间
.build();
}
/**
* 发送 GET 请求
*
* @param url 请求的 URL
* @return 响应结果字符串
* @throws IOException 网络请求异常
*/
public static String sendGetRequest(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().string();
}
return null;
}
}
/**
* 发送带参数的 GET 请求
*
* @param url 请求的 URL
* @param params 请求参数
* @return 响应结果字符串
* @throws IOException 网络请求异常
*/
public static String sendGetRequest(String url, Map<String, String> params) throws IOException {
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
}
}
String finalUrl = urlBuilder.build().toString();
return sendGetRequest(finalUrl);
}
/**
* 发送 POST 请求,请求体为 JSON 格式
*
* @param url 请求的 URL
* @param jsonBody JSON 格式的请求体
* @return 响应结果字符串
* @throws IOException 网络请求异常
*/
public static String sendPostRequest(String url, String jsonBody) throws IOException {
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(jsonBody, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().string();
}
return null;
}
}
/**
* 发送 POST 请求,请求体为表单格式
*
* @param url 请求的 URL
* @param params 表单参数
* @return 响应结果字符串
* @throws IOException 网络请求异常
*/
public static String sendPostFormRequest(String url, Map<String, String> params) throws IOException {
FormBody.Builder formBodyBuilder = new FormBody.Builder();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
formBodyBuilder.add(entry.getKey(), entry.getValue());
}
}
RequestBody formBody = formBodyBuilder.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().string();
}
return null;
}
}
}
使用示例
以下是如何在 Spring Boot 的 Controller 中使用这个工具类:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/http")
public class HttpController {
@GetMapping("/get")
public String getRequest() throws IOException {
String url = "https://jsonplaceholder.typicode.com/todos/1";
return OkHttpUtils.sendGetRequest(url);
}
@GetMapping("/getWithParams")
public String getRequestWithParams() throws IOException {
String url = "https://jsonplaceholder.typicode.com/posts";
Map<String, String> params = new HashMap<>();
params.put("userId", "1");
return OkHttpUtils.sendGetRequest(url, params);
}
@GetMapping("/postJson")
public String postJsonRequest() throws IOException {
String url = "https://jsonplaceholder.typicode.com/posts";
String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
return OkHttpUtils.sendPostRequest(url, jsonBody);
}
@GetMapping("/postForm")
public String postFormRequest() throws IOException {
String url = "https://jsonplaceholder.typicode.com/posts";
Map<String, String> params = new HashMap<>();
params.put("title", "foo");
params.put("body", "bar");
params.put("userId", "1");
return OkHttpUtils.sendPostFormRequest(url, params);
}
}
注意事项
- 此工具类中的
OkHttpClient
是静态初始化的,在整个应用程序中共享一个实例,以提高性能和复用连接。 - 对于异常处理,当前示例只是简单地将
IOException
抛出,在实际应用中,你可能需要根据具体情况进行更详细的异常处理,例如记录日志、返回合适的错误信息等。 - 确保在使用时处理好可能的网络异常和超时情况,以保证应用程序的健壮性。