在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@Beanpublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("Request failed: " + e.getMessage());}@Overridepublic 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());}}});}
}