在系统编写的时候,常常会与外围系统的接口进行对接,或者调用一些子系统的接口,那么此时会涉及到http请求。
在以往,我没有采用统一的方式编写这类程序,会使用hutool、RestTemplate,所以,在此,我想给自己编写一套统一的请求方式,以便学习。
采用框架:OkHttp3
,原因是了解到此框架性能良好,安全性好。
需求:
- 普通的get、post请求
- 异步的post请求
OkHttp基础概念
一、OkHttpClient
此类是框架的核心客户端
上手使用
添加Maven依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 2023年最新稳定版 -->
</dependency>
工具类
package org.example;
import okhttp3.*;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 基于okhttp4的http请求工具类
* @author songtingwu
*/
public class HttpUtil {
/**
* 全局单例客户端
*/
private static final OkHttpClient client = new OkHttpClient.Builder()
.callTimeout(30, TimeUnit.SECONDS)
.build();
private HttpUtil(){}
/**
* 同步的Get请求
*/
public static String get(String url, Map<String, Object> queryParams) throws Exception{
// 构建HttpUrl
HttpUrl httpUrl = buildGetUrl(url, queryParams);
// 封装Request请求信息
Request request = new Request.Builder()
.url(httpUrl)
.get()
.build();
// 执行请求
try (Response response = client.newCall(request).execute();) {
if ( response.isSuccessful() ){
// 请求成功
return response.body().string();
}else{
throw new Exception(response.message());
}
}catch (Exception e){
throw e;
}
}
private static HttpUrl buildGetUrl(String url, Map<String, Object> params) throws Exception{
if(url == null || "".equals(url)){
throw new Exception("请求url不能为空");
}
// 创建基础URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(url)
.newBuilder();
if(params != null && !params.isEmpty()){
// 添加参数
for (Map.Entry<String, Object> entry : params.entrySet()) {
urlBuilder.addQueryParameter(entry.getKey(), String.valueOf(entry.getValue()));
}
}
HttpUrl httpUrl = urlBuilder.build();
return httpUrl;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。