增加构建通知
This commit is contained in:
parent
06d4c799b2
commit
bbcc11b511
@ -33,30 +33,27 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
private ObjectMapper objectMapper;
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void executeInternal(DelegateExecution execution,
|
protected void executeInternal(DelegateExecution execution,
|
||||||
Map<String, Object> configs,
|
Map<String, Object> configs,
|
||||||
HttpRequestInputMapping input) {
|
HttpRequestInputMapping input) {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
logInfo(String.format("开始HTTP请求: %s %s (超时: %dms)",
|
|
||||||
input.getMethod(), input.getUrl(), input.getTimeout()));
|
|
||||||
|
|
||||||
// 1. 创建专属的RestTemplate,使用节点配置的超时时间
|
// 1. 创建专属的RestTemplate,使用节点配置的超时时间
|
||||||
RestTemplate restTemplate = createRestTemplate(input.getTimeout());
|
RestTemplate restTemplate = createRestTemplate(input.getTimeout());
|
||||||
|
|
||||||
// 2. 构建请求
|
// 2. 构建请求
|
||||||
HttpHeaders headers = buildHeaders(input.getHeadersAsMap());
|
HttpHeaders headers = buildHeaders(input.getHeadersAsMap());
|
||||||
HttpEntity<?> entity = new HttpEntity<>(input.getBody(), headers);
|
HttpEntity<?> entity = new HttpEntity<>(input.getBody(), headers);
|
||||||
|
|
||||||
// 3. 构建完整URL(带查询参数)
|
// 3. 构建完整URL(带查询参数)
|
||||||
String fullUrl = buildUrl(input.getUrl(), input.getQueryParamsAsMap());
|
String fullUrl = buildUrl(input.getUrl(), input.getQueryParamsAsMap());
|
||||||
|
|
||||||
logInfo(String.format("请求URL: %s", fullUrl));
|
|
||||||
if (input.getBody() != null) {
|
if (input.getBody() != null) {
|
||||||
logInfo(String.format("请求体: %s", JsonUtils.toJson(input.getBody())));
|
logInfo(String.format("请求体: %s", JsonUtils.toJson(input.getBody())));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 发送HTTP请求
|
// 4. 发送HTTP请求
|
||||||
ResponseEntity<String> response = restTemplate.exchange(
|
ResponseEntity<String> response = restTemplate.exchange(
|
||||||
fullUrl,
|
fullUrl,
|
||||||
@ -64,13 +61,13 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
entity,
|
entity,
|
||||||
String.class
|
String.class
|
||||||
);
|
);
|
||||||
|
|
||||||
// 4. 解析响应
|
// 4. 解析响应
|
||||||
long responseTime = System.currentTimeMillis() - startTime;
|
long responseTime = System.currentTimeMillis() - startTime;
|
||||||
parseResponse(response, responseTime, input.getResponseBodyType());
|
parseResponse(response, responseTime, input.getResponseBodyType());
|
||||||
|
|
||||||
logInfo(String.format("HTTP请求成功: 状态码=%d, 耗时=%dms, 响应大小=%d bytes", output.getStatusCode(), output.getResponseTime(), output.getResponseSize()));
|
logInfo(String.format("HTTP请求成功: 状态码=%d, 耗时=%dms, 响应大小=%d bytes", output.getStatusCode(), output.getResponseTime(), output.getResponseSize()));
|
||||||
|
|
||||||
} catch (HttpClientErrorException | HttpServerErrorException e) {
|
} catch (HttpClientErrorException | HttpServerErrorException e) {
|
||||||
// HTTP错误(4xx, 5xx)
|
// HTTP错误(4xx, 5xx)
|
||||||
handleHttpError(e, System.currentTimeMillis() - startTime);
|
handleHttpError(e, System.currentTimeMillis() - startTime);
|
||||||
@ -79,28 +76,28 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
handleGeneralError(e);
|
handleGeneralError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析响应
|
* 解析响应
|
||||||
*/
|
*/
|
||||||
private void parseResponse(ResponseEntity<String> response, long responseTime,
|
private void parseResponse(ResponseEntity<String> response, long responseTime,
|
||||||
HttpRequestInputMapping.ResponseBodyType type) {
|
HttpRequestInputMapping.ResponseBodyType type) {
|
||||||
output.setStatusCode(response.getStatusCode().value());
|
output.setStatusCode(response.getStatusCode().value());
|
||||||
output.setResponseTime(responseTime);
|
output.setResponseTime(responseTime);
|
||||||
output.setIsSuccess(response.getStatusCode().is2xxSuccessful());
|
output.setIsSuccess(response.getStatusCode().is2xxSuccessful());
|
||||||
|
|
||||||
// 解析响应头
|
// 解析响应头
|
||||||
Map<String, String> headerMap = new HashMap<>();
|
Map<String, String> headerMap = new HashMap<>();
|
||||||
response.getHeaders().forEach((k, v) ->
|
response.getHeaders().forEach((k, v) ->
|
||||||
headerMap.put(k, String.join(", ", v))
|
headerMap.put(k, String.join(", ", v))
|
||||||
);
|
);
|
||||||
output.setResponseHeaders(headerMap);
|
output.setResponseHeaders(headerMap);
|
||||||
|
|
||||||
// 解析响应体
|
// 解析响应体
|
||||||
String body = response.getBody();
|
String body = response.getBody();
|
||||||
if (body != null) {
|
if (body != null) {
|
||||||
output.setResponseSize((long) body.length());
|
output.setResponseSize((long) body.length());
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case JSON -> {
|
case JSON -> {
|
||||||
try {
|
try {
|
||||||
@ -115,7 +112,7 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
}
|
}
|
||||||
case TEXT -> {
|
case TEXT -> {
|
||||||
output.setResponseBody(body);
|
output.setResponseBody(body);
|
||||||
logInfo(String.format("响应体(TEXT): %s", body.length() > 200 ?
|
logInfo(String.format("响应体(TEXT): %s", body.length() > 200 ?
|
||||||
body.substring(0, 200) + "..." : body));
|
body.substring(0, 200) + "..." : body));
|
||||||
}
|
}
|
||||||
case XML -> output.setResponseBody(body); // 简化实现,直接返回文本
|
case XML -> output.setResponseBody(body); // 简化实现,直接返回文本
|
||||||
@ -123,7 +120,7 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析JSON响应体
|
* 解析JSON响应体
|
||||||
*/
|
*/
|
||||||
@ -137,7 +134,7 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理HTTP错误(4xx, 5xx)
|
* 处理HTTP错误(4xx, 5xx)
|
||||||
* <p>
|
* <p>
|
||||||
@ -146,7 +143,7 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
private void handleHttpError(Exception e, long responseTime) {
|
private void handleHttpError(Exception e, long responseTime) {
|
||||||
HttpStatusCode statusCode = null;
|
HttpStatusCode statusCode = null;
|
||||||
String responseBody = null;
|
String responseBody = null;
|
||||||
|
|
||||||
if (e instanceof HttpClientErrorException) {
|
if (e instanceof HttpClientErrorException) {
|
||||||
HttpClientErrorException clientError = (HttpClientErrorException) e;
|
HttpClientErrorException clientError = (HttpClientErrorException) e;
|
||||||
statusCode = clientError.getStatusCode();
|
statusCode = clientError.getStatusCode();
|
||||||
@ -156,32 +153,32 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
statusCode = serverError.getStatusCode();
|
statusCode = serverError.getStatusCode();
|
||||||
responseBody = serverError.getResponseBodyAsString();
|
responseBody = serverError.getResponseBodyAsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置详细的 output 信息
|
// 设置详细的 output 信息
|
||||||
output.setStatusCode(statusCode != null ? statusCode.value() : 0);
|
output.setStatusCode(statusCode != null ? statusCode.value() : 0);
|
||||||
output.setResponseTime(responseTime);
|
output.setResponseTime(responseTime);
|
||||||
output.setIsSuccess(false);
|
output.setIsSuccess(false);
|
||||||
output.setErrorMessage(e.getMessage());
|
output.setErrorMessage(e.getMessage());
|
||||||
|
|
||||||
// ⚠️ 注意:HTTP 错误响应通常是 HTML 错误页面(不是 JSON),设置为 null 避免模板解析错误
|
// ⚠️ 注意:HTTP 错误响应通常是 HTML 错误页面(不是 JSON),设置为 null 避免模板解析错误
|
||||||
// 如果需要访问原始错误响应,可以从 errorMessage 中获取
|
// 如果需要访问原始错误响应,可以从 errorMessage 中获取
|
||||||
output.setResponseBody(null);
|
output.setResponseBody(null);
|
||||||
|
|
||||||
if (responseBody != null && !responseBody.isEmpty()) {
|
if (responseBody != null && !responseBody.isEmpty()) {
|
||||||
output.setResponseSize((long) responseBody.length());
|
output.setResponseSize((long) responseBody.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
String errorMsg = String.format("HTTP请求失败: 状态码=%d, 错误=%s",
|
String errorMsg = String.format("HTTP请求失败: 状态码=%d, 错误=%s",
|
||||||
output.getStatusCode(), e.getMessage());
|
output.getStatusCode(), e.getMessage());
|
||||||
|
|
||||||
logInfo(errorMsg);
|
logInfo(errorMsg);
|
||||||
|
|
||||||
// 抛出异常,由 BaseNodeDelegate 根据 continueOnFailure 决定:
|
// 抛出异常,由 BaseNodeDelegate 根据 continueOnFailure 决定:
|
||||||
// - continueOnFailure=true: 调用 markFailure(e),设置 output.status=FAILURE,保存 output,继续执行
|
// - continueOnFailure=true: 调用 markFailure(e),设置 output.status=FAILURE,保存 output,继续执行
|
||||||
// - continueOnFailure=false: 调用 terminateWorkflow(e),抛出 BpmnError,终止工作流
|
// - continueOnFailure=false: 调用 terminateWorkflow(e),抛出 BpmnError,终止工作流
|
||||||
throw new RuntimeException(errorMsg, e);
|
throw new RuntimeException(errorMsg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理一般错误(网络超时、连接失败等)
|
* 处理一般错误(网络超时、连接失败等)
|
||||||
* <p>
|
* <p>
|
||||||
@ -193,56 +190,56 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
output.setStatusCode(0); // 0 表示未获取到 HTTP 状态码
|
output.setStatusCode(0); // 0 表示未获取到 HTTP 状态码
|
||||||
output.setErrorMessage(e.getMessage());
|
output.setErrorMessage(e.getMessage());
|
||||||
output.setResponseBody(null);
|
output.setResponseBody(null);
|
||||||
|
|
||||||
String errorMsg = String.format("HTTP请求异常: %s - %s",
|
String errorMsg = String.format("HTTP请求异常: %s - %s",
|
||||||
e.getClass().getSimpleName(), e.getMessage());
|
e.getClass().getSimpleName(), e.getMessage());
|
||||||
|
|
||||||
logInfo(errorMsg);
|
logInfo(errorMsg);
|
||||||
|
|
||||||
// 抛出异常,由 BaseNodeDelegate 根据 continueOnFailure 决定:
|
// 抛出异常,由 BaseNodeDelegate 根据 continueOnFailure 决定:
|
||||||
// - continueOnFailure=true: 调用 markFailure(e),设置 output.status=FAILURE,保存 output,继续执行
|
// - continueOnFailure=true: 调用 markFailure(e),设置 output.status=FAILURE,保存 output,继续执行
|
||||||
// - continueOnFailure=false: 调用 terminateWorkflow(e),抛出 BpmnError,终止工作流
|
// - continueOnFailure=false: 调用 terminateWorkflow(e),抛出 BpmnError,终止工作流
|
||||||
throw new RuntimeException(errorMsg, e);
|
throw new RuntimeException(errorMsg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建RestTemplate(使用节点配置的超时时间)
|
* 创建RestTemplate(使用节点配置的超时时间)
|
||||||
*/
|
*/
|
||||||
private RestTemplate createRestTemplate(Integer timeout) {
|
private RestTemplate createRestTemplate(Integer timeout) {
|
||||||
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
|
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
|
||||||
|
|
||||||
// 使用节点配置的超时时间
|
// 使用节点配置的超时时间
|
||||||
int timeoutMs = (timeout != null && timeout > 0) ? timeout : 30000;
|
int timeoutMs = (timeout != null && timeout > 0) ? timeout : 30000;
|
||||||
|
|
||||||
// 连接超时:建立TCP连接的超时时间
|
// 连接超时:建立TCP连接的超时时间
|
||||||
factory.setConnectTimeout(timeoutMs);
|
factory.setConnectTimeout(timeoutMs);
|
||||||
|
|
||||||
// 读取超时:等待服务器响应的超时时间
|
// 读取超时:等待服务器响应的超时时间
|
||||||
factory.setReadTimeout(timeoutMs);
|
factory.setReadTimeout(timeoutMs);
|
||||||
|
|
||||||
RestTemplate restTemplate = new RestTemplate(factory);
|
RestTemplate restTemplate = new RestTemplate(factory);
|
||||||
return restTemplate;
|
return restTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建请求头
|
* 构建请求头
|
||||||
*/
|
*/
|
||||||
private HttpHeaders buildHeaders(Map<String, String> headersMap) {
|
private HttpHeaders buildHeaders(Map<String, String> headersMap) {
|
||||||
HttpHeaders headers = new HttpHeaders();
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
|
||||||
// 默认设置 Content-Type 为 JSON(如果有body且未指定)
|
// 默认设置 Content-Type 为 JSON(如果有body且未指定)
|
||||||
if (currentInputMapping.getBody() != null &&
|
if (currentInputMapping.getBody() != null &&
|
||||||
(headersMap == null || !headersMap.containsKey("Content-Type"))) {
|
(headersMap == null || !headersMap.containsKey("Content-Type"))) {
|
||||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (headersMap != null) {
|
if (headersMap != null) {
|
||||||
headersMap.forEach(headers::set);
|
headersMap.forEach(headers::set);
|
||||||
}
|
}
|
||||||
|
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建完整URL(带查询参数)
|
* 构建完整URL(带查询参数)
|
||||||
*/
|
*/
|
||||||
@ -250,7 +247,7 @@ public class HttpRequestNodeDelegate extends BaseNodeDelegate<HttpRequestInputMa
|
|||||||
if (queryParams == null || queryParams.isEmpty()) {
|
if (queryParams == null || queryParams.isEmpty()) {
|
||||||
return baseUrl;
|
return baseUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl);
|
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl);
|
||||||
queryParams.forEach(builder::queryParam);
|
queryParams.forEach(builder::queryParam);
|
||||||
return builder.toUriString();
|
return builder.toUriString();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user