diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java new file mode 100644 index 000000000..d4c03d028 --- /dev/null +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/common/core/alarm/strategy/WebhookAlarm.java @@ -0,0 +1,116 @@ +package com.aizuda.snailjob.common.core.alarm.strategy; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.net.url.UrlPath; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.aizuda.snailjob.common.core.alarm.AlarmContext; +import com.aizuda.snailjob.common.core.alarm.attribute.WebhookAttribute; +import com.aizuda.snailjob.common.core.constant.SystemConstants; +import com.aizuda.snailjob.common.core.enums.AlarmTypeEnum; +import com.aizuda.snailjob.common.core.enums.ContentTypeEnum; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.log.SnailJobLog; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * Webhook 告警策略 + *
+ * 设计原则:
+ * 1. 框架只负责投递,不关心业务协议
+ * 2. Payload 由使用者完全定义
+ * 3. 不绑定任何第三方 Webhook 规范
+ *
+ * @author AprilWind
+ */
+@Component
+@RequiredArgsConstructor
+public class WebhookAlarm extends AbstractAlarm
+ * 设计原则:
+ * 1. 用户完全自定义 Payload(推荐做法):
+ * - 如果 AlarmContext.notifyAttribute 中已经提供完整 JSON 字符串,
+ * 框架会原样发送。
+ * 2. 框架兜底结构(保证最基本可用):
+ * - title: 告警标题
+ * - text: 告警内容
+ * - timestamp: 当前时间戳
+ * 3. 支持根据 webhookUrl 的 path 或 query 自定义不同 Payload:
+ * - /auth/webhook → 纯文本发送
+ * - /markdown → 使用 Markdown 格式
+ * - /third-party/alert → 第三方自定义协议
+ * 4. 用户可扩展方式:
+ * - 在 notifyAttribute 中增加自定义字段,例如 type、level 等
+ * - 根据 webhookUrl 做路由,发送不同 Payload
+ *
+ * @param context AlarmContext 对象,包含 title、text、notifyAttribute 等信息
+ * @return JSON 字符串,作为 Webhook 请求的 body
+ */
+ private String buildPayload(AlarmContext context) {
+ // 解析 notifyAttribute,获取 webhookUrl 等用户自定义信息
+ Map