项目场景
很多场景下我们需要通过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;}}