增加构建通知

This commit is contained in:
dengqichen 2025-11-20 14:15:55 +08:00
parent 06d4c799b2
commit bbcc11b511

View File

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