/**
* OkHttp 工具类
*/
@Slf4j
public class OkHttpUtil {
private OkHttpUtil() {
}
//////////////////////////////////////////////////////////////////////////
// OkHttpClient Singleton
//////////////////////////////////////////////////////////////////////////
public static OkHttpClient getOKHttpClientInstance() {
return LazyLoad.client;
}
private static class LazyLoad {
private static final OkHttpClient client = new OkHttpClient();
}
//////////////////////////////////////////////////////////////////////////
// util method
//////////////////////////////////////////////////////////////////////////
/**
* <h2>执行post请求,注意要求目标接口返回响应头具有application/json </h2>
*
* @param url 请求地址
* @param param 携带的参数实体类
* @param headersParam 请求头参数
* @param <T> 实体类类型
* @return {@link Response} 响应
* @throws IOException 执行请求时可能出现的异常
*/
public static <T> Response doPost(String url, T param, Map<String, String> headersParam) throws IOException {
MediaType contentType = MediaType.get(org.springframework.http.MediaType.APPLICATION_JSON_VALUE);
RequestBody requestBody = RequestBody.create(JSON.toJSONString(param), contentType);
// 构建 headers
Headers headers = _buildHeaders(headersParam);
// 构建 request
Request request = new Request.Builder()
.headers(headers)
.url(url)
.post(requestBody)
.build();
// 执行请求, 直接返回即可
return getOKHttpClientInstance().newCall(request).execute();
// sb了, 居然直接关掉流了。导致出现了 java.lang.IllegalStateException: closed
// try (Response response = getOKHttpClientInstance().newCall(request).execute()) {
// return response;
// } catch (IOException e) {
// log.error("请求url: {}时候发生了错误: {}", url, e.getLocalizedMessage(), e);
// throw e;
// }
}
/**
* 填充 header 为 headers
*
* @param headersParam {@link Map} headers 头
* @return {@link Headers} okHttp 的 headers 头
*/
private static Headers _buildHeaders(Map<String, String> headersParam) {
Headers.Builder headerBuilder = new Headers.Builder();
for (Map.Entry<String, String> entry : headersParam.entrySet()) {
headerBuilder.add(entry.getKey(), entry.getValue());
}
return headerBuilder.build();
}
}