package cn.iocoder.yudao.module.iot.service.rule.data.action; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataSinkDO; import cn.iocoder.yudao.module.iot.dal.dataobject.rule.config.IotDataSinkHttpConfig; import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.util.HashMap; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; /** * HTTP 的 {@link IotDataRuleAction} 实现类 * * @author HUIHUI */ @Component @Slf4j public class IotHttpDataSinkAction implements IotDataRuleAction { @Resource private RestTemplate restTemplate; @Override public Integer getType() { return IotDataSinkTypeEnum.HTTP.getType(); } @Override @SuppressWarnings("unchecked") public void execute(IotDeviceMessage message, IotDataSinkDO dataSink) { IotDataSinkHttpConfig config = (IotDataSinkHttpConfig) dataSink.getConfig(); Assert.notNull(config, "配置({})不能为空", dataSink.getId()); String url = null; HttpMethod method = HttpMethod.valueOf(config.getMethod().toUpperCase()); HttpEntity requestEntity = null; ResponseEntity responseEntity = null; try { // 1.1 构建 Header HttpHeaders headers = new HttpHeaders(); if (CollUtil.isNotEmpty(config.getHeaders())) { config.getHeaders().putAll(config.getHeaders()); } headers.add(HEADER_TENANT_ID, message.getTenantId().toString()); // 1.2 构建 URL UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(config.getUrl()); if (CollUtil.isNotEmpty(config.getQuery())) { config.getQuery().forEach(uriBuilder::queryParam); } // 1.3 构建请求体 if (method == HttpMethod.GET) { uriBuilder.queryParam("message", HttpUtils.encodeUtf8(JsonUtils.toJsonString(message))); url = uriBuilder.build().toUriString(); requestEntity = new HttpEntity<>(headers); } else { url = uriBuilder.build().toUriString(); Map requestBody = JsonUtils.parseObject(config.getBody(), Map.class); if (requestBody == null) { requestBody = new HashMap<>(); } requestBody.put("message", message); headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); requestEntity = new HttpEntity<>(JsonUtils.toJsonString(requestBody), headers); } // 2. 发送请求 responseEntity = restTemplate.exchange(url, method, requestEntity, String.class); if (responseEntity.getStatusCode().is2xxSuccessful()) { log.info("[execute][message({}) config({}) url({}) method({}) requestEntity({}) 请求成功({})]", message, config, url, method, requestEntity, responseEntity); } else { log.error("[execute][message({}) config({}) url({}) method({}) requestEntity({}) 请求失败({})]", message, config, url, method, requestEntity, responseEntity); } } catch (Exception e) { log.error("[execute][message({}) config({}) url({}) method({}) requestEntity({}) 请求异常({})]", message, config, url, method, requestEntity, responseEntity, e); } } }