在springboot中使用okhttp3
目录
在springboot中使用okhttp3
在 Spring Boot 项目中使用 OkHttp3
进行 HTTP 请求是一个高效且流行的方式。OkHttp3
是一个 Java HTTP 客户端,可以处理各种请求类型,比如 GET、POST、PUT 等,并且支持高效的 HTTP 连接池、请求和响应缓存、以及异步请求处理等。
maven项目中首先是需要引入pom文件:
<dependencies>
<!-- OkHttp3 dependency -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version> <!-- 使用最新的稳定版本 -->
</dependency>
</dependencies>
创建 OkHttpClient
配置类
接下来,你可以在 Spring Boot 中创建一个配置类,用于配置 OkHttpClient
实例。这是为了方便地进行请求处理和注入到 Spring 中。如果项目中用的地方比较多就封装成一个bean在使用的时候通过spring的注入方式即可使用,如果是临时用一下可以直接在class中创建,通过static代码块初始化。
注册bean的方式:
@Configuration
public class OkHttpConfig {
// 创建 OkHttpClient Bean
@Bean
public OkHttpClient okHttpClient() {
//可以引入线程池单独线程调用
CONNECTION_POOL = new ConnectionPool(1024, 5, TimeUnit.MINUTES);
OK_HTTP_CLIENT = new OkHttpClient.Builder()
.connectionPool(CONNECTION_POOL)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.MINUTES)
.retryOnConnectionFailure(true)
.pingInterval(Duration.ofSeconds(59))
.build();
}
}
在class类中直接使用:
@Slf4j
@Service
public class http3Test {
// 余额最大空闲时间
private final static int idleTime = 60 * 60 * 24;
private static final OkHttpClient OK_HTTP_CLIENT;
private static final ConnectionPool CONNECTION_POOL;
static {
CONNECTION_POOL = new ConnectionPool(1024, 5, TimeUnit.MINUTES);
OK_HTTP_CLIENT = new OkHttpClient.Builder()
.connectionPool(CONNECTION_POOL)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.MINUTES)
.retryOnConnectionFailure(true)
.pingInterval(Duration.ofSeconds(59))
.build();
}
发送get请求:
@Service
public class OkHttpService {
@Autowired
private OkHttpClient okHttpClient;
public String sendGetRequest(String url) throws IOException {
// 构建请求
Request request = new Request.Builder()
.url(url)
.build();
// 执行请求并获取响应
try (Response response = okHttpClient.newCall(request).execute()) {
if (response.isSuccessful()) {
// 返回响应体内容
return response.body().string();
} else {
return "Request failed with code: " + response.code();
}
}
}
}
发送post请求:
@Service
public class OkHttpService {
@Autowired
private OkHttpClient okHttpClient;
public String sendPostRequest(String url, String jsonBody) throws IOException {
// 创建请求体
RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json; charset=utf-8"));
// 构建请求
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
// 执行请求并获取响应
try (Response response = okHttpClient.newCall(request).execute()) {
if (response.isSuccessful()) {
// 返回响应体内容
return response.body().string();
} else {
return "Request failed with code: " + response.code();
}
}
}
}
另外还可以发送异步请求,不需要使用使用 execute调用http3提供的enqueue方法
:
import okhttp3.*;
public class AsyncOkHttpService {
private OkHttpClient okHttpClient = new OkHttpClient();
public void sendAsyncGetRequest(String url) {
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("Request failed: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
System.out.println("Response: " + response.body().string());
} else {
System.out.println("Request failed with code: " + response.code());
}
}
});
}
}