@@ -1,17 +1,22 @@
|
||||
package cn.code.nl.framework.execute.util.http;
|
||||
|
||||
import cn.code.nl.framework.common.exception.ServiceException;
|
||||
import cn.code.nl.framework.common.pojo.AcsBaseRespDTO;
|
||||
import cn.code.nl.framework.common.exception.enums.GlobalErrorCodeConstants;
|
||||
import cn.code.nl.framework.common.pojo.AcsCommonResult;
|
||||
import cn.code.nl.framework.common.util.http.HttpUtils;
|
||||
import cn.code.nl.framework.common.util.json.JsonUtils;
|
||||
import cn.code.nl.framework.common.util.spring.SpringUtils;
|
||||
import cn.code.nl.module.infra.api.config.ConfigApi;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.net.*;
|
||||
import java.net.ConnectException;
|
||||
import java.net.NoRouteToHostException;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -32,29 +37,32 @@ public class AcsUtil {
|
||||
private static final String ACS_DISABLED = "0";
|
||||
|
||||
/**
|
||||
* 发送 POST 请求并解析响应
|
||||
* 发送 POST 请求并解析 ACS 通用响应
|
||||
*
|
||||
* @param serverAddress ACS 服务地址
|
||||
* @param api API 路径
|
||||
* @param request 请求参数
|
||||
* @param responseType 响应类型
|
||||
* @return 响应对象
|
||||
* @param api API 路径
|
||||
* @param request 请求参数
|
||||
* @param responseType data 响应类型
|
||||
* @return ACS 通用响应
|
||||
*/
|
||||
public static <T> T post(String serverAddress, String api, Object request, Class<T> responseType) {
|
||||
public static <T> AcsCommonResult<T> post(String serverAddress, String api, Object request, Class<T> responseType) {
|
||||
if (isAcsDisabled()) {
|
||||
return buildDefaultSuccessResponse(responseType);
|
||||
return buildDefaultSuccessResponse();
|
||||
}
|
||||
String url = buildUrl(serverAddress, api);
|
||||
String response;
|
||||
try {
|
||||
response = HttpUtils.post(url, headers(), JsonUtils.toJsonString(request));
|
||||
log.info("ACS 返回值:{}", JSON.toJSONString(response));
|
||||
} catch (RuntimeException ex) {
|
||||
if (isNetworkException(ex)) {
|
||||
throw new ServiceException(500, "ACS服务网络不通");
|
||||
log.error("ACS 服务网络不通,url={},request={}", url, JsonUtils.toJsonString(request), ex);
|
||||
return buildErrorResponse("ACS服务网络不通");
|
||||
}
|
||||
throw ex;
|
||||
log.error("ACS 请求失败,url={},request={}", url, JsonUtils.toJsonString(request), ex);
|
||||
return buildErrorResponse(ex.getMessage());
|
||||
}
|
||||
return JsonUtils.parseObject(response, responseType);
|
||||
return parseResponse(response, responseType);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,13 +90,40 @@ public class AcsUtil {
|
||||
/**
|
||||
* 构建默认成功响应
|
||||
*/
|
||||
private static <T> T buildDefaultSuccessResponse(Class<T> responseType) {
|
||||
AcsBaseRespDTO response = new AcsBaseRespDTO();
|
||||
response.setSuccess(true);
|
||||
response.setCode("200");
|
||||
response.setTraceId(IdUtil.simpleUUID());
|
||||
response.setTimestamp(System.currentTimeMillis());
|
||||
return JsonUtils.convertObject(response, responseType);
|
||||
private static <T> AcsCommonResult<T> buildDefaultSuccessResponse() {
|
||||
AcsCommonResult<T> response = new AcsCommonResult<>();
|
||||
response.setCode(GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||
response.setMessage("ACS 已关闭,跳过请求");
|
||||
response.setTimestamp(String.valueOf(System.currentTimeMillis()));
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建失败响应,具体是否抛异常由业务层决定
|
||||
*/
|
||||
private static <T> AcsCommonResult<T> buildErrorResponse(String message) {
|
||||
AcsCommonResult<T> response = new AcsCommonResult<>();
|
||||
response.setCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode());
|
||||
response.setMessage(StrUtil.blankToDefault(message, "ACS 请求失败"));
|
||||
response.setTimestamp(String.valueOf(System.currentTimeMillis()));
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 ACS 响应,并将 data 转为业务指定类型
|
||||
*/
|
||||
private static <T> AcsCommonResult<T> parseResponse(String response, Class<T> responseType) {
|
||||
AcsCommonResult<Object> rawResult = JsonUtils.parseObject(response, new TypeReference<AcsCommonResult<Object>>() {
|
||||
});
|
||||
AcsCommonResult<T> result = new AcsCommonResult<>();
|
||||
result.setTotalElements(rawResult.getTotalElements());
|
||||
result.setData(JsonUtils.convertObject(rawResult.getData(), responseType));
|
||||
result.setTimestamp(rawResult.getTimestamp());
|
||||
result.setCode(rawResult.getCode());
|
||||
result.setMessage(rawResult.getMessage());
|
||||
result.setRespCode(rawResult.getRespCode());
|
||||
result.setRespMsg(rawResult.getRespMsg());
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user