项目场景
很多场景下我们需要通过http请求去访问三方资源的时候,需要一个通用性的http工具,此工具就是用在着方面的,本工具就是用原生的okhttp加以简单封装,配合使用hutool的工具的jsonobject,其中使用使用这个jsonobject的好处就是可以使用其getByPath获取到任意节点的结果,快速业务判断
依赖
提示:这里描述项目中遇到的问题:
例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>com.squareup</groupId>
<artifactId>okhttp3</artifactId>
<version>3.9.1</version>
</dependency>
工具代码
package utils;
import cn.hutool.http.ContentType;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 简单封装的okhttpcient工具用于返回同一反参
*
* @author liaoqian
* @date 2024-01-17
*/
@Slf4j
@SuppressWarnings("all")
public class CommonOkHttpClientUtil {
private static final String okHttpClientName = "commonOkHttpClientUtil";
/**
* 连接超时时间
**/
private static final int CONNECT_TIMEOUT_TEN_SECONDS = 10;
/**
* 读取返回信息超时时间
**/
private static final int READ_TIMEOUT_THIRTY_SECONDS = 30;
private static OkHttpClient okHttpClient;
static {
if (okHttpClient == null) {
synchronized (CommonOkHttpClientUtil.class) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT_TEN_SECONDS, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT_THIRTY_SECONDS, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
}
}
}
}
/**
* @param host 请求host
* @param uri 请求uri
* @param method 请求方式
* @param headers 请求头
* @param params 请求参数
* @param body 请求体
* @param <T> 泛型
* @return 返回GreatonceAjaxModel
*/
public static JSONObject ajax(String host, String uri, String method, Map<String, String> headers, Map<String, String> params, Map<String, String> body) {
Response response = ajaxProcess(host, uri, method, headers, params, body);
JSONObject jsonObject = null;
if (response != null) {
try (ResponseBody responseBody = response.body()) {
String result = responseBody.string();
log.info("***** {} ajax result : {} *****", okHttpClientName, result);
if (JSON.isValid(result)) {
jsonObject = new JSONObject(result);
} else {
jsonObject = new JSONObject(result);
}
return jsonObject;
} catch (Exception e) {
log.error("***** {} ajaxProcess e : {} *****", okHttpClientName, e);
}
}
return jsonObject;
}
private static Response ajaxProcess(String host, String uri, String method, Map<String, String> headers, Map<String, String> params, Map<String, String> body) {
OkHttpClient client = okHttpClient;
String url = host + uri;
Request.Builder builder = new Request.Builder();
// 请求头处理
if (headers != null && !headers.isEmpty()) {
builder.headers(Headers.of(headers));
}
// 请求方式处理
if (true) {
if (params != null && !params.isEmpty()) {
StringBuilder sb = new StringBuilder();
sb.append("?");
params.entrySet().stream().forEach(e -> {
sb.append(e.getKey()).append("=").append(String.valueOf(e.getValue())).append("&");
});
sb.delete(sb.length() - 1, sb.length());
url += sb.toString();
}
builder.get();
}
if ("POST".equals(method.toUpperCase())) {
if (body != null) {
builder.post(RequestBody.create(MediaType.parse(ContentType.JSON.toString()), JSON.toJSONString(body)));
}
}
Request request = builder.url(url).build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
log.error("***** {} ajaxProcess e : {} *****", okHttpClientName, e);
}
return response;
}
}