Webhook 目标
场地、座位图及座位布局发生变化时,Seatmap.pro 可以通知您的系统。本页介绍 Webhook 目标的要求,以及投递失败时的处理方式。
事件
| 事件 | 发送时机 |
|---|---|
venue.created |
创建场地。 |
venue.updated |
修改场地。 |
venue.deleted |
删除场地。 |
schema.created |
创建座位图。 |
schema.updated |
修改座位图。 |
schema.deleted |
删除座位图。 |
seatmap.stored |
保存座位布局。 |
目标要求
不兼容变更:自 1.70.0 起,Webhook 目标必须是公共 HTTPS 地址。不同时满足两个条件的目标在保存时会被拒绝,对其投递时会记录错误类型 TARGET_NOT_ALLOWED。
目标需满足:
- URL 为包含主机名的有效 URI。
- 协议为
https。普通http会被拒绝,除非自托管运营方已为内部目标启用该协议,详见下文。 - 主机解析出的每个地址都可公开路由。
若任一解析地址属于回环、链路本地、站点本地(如 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 私有网段)、多播、运营商级 NAT 或其他保留地址,该主机将被拒绝。IPv6 唯一本地地址也会被拒绝;IPv4 映射的 IPv6 地址若底层 IPv4 地址被阻止,同样不可用。完全无法解析的主机也会被拒绝。
端点不是公共地址时
在公共主机名上终止 TLS,再向内部转发即可,例如在服务前部署反向代理或 API 网关。不要认为内部主机名能通过公共 DNS 解析到私有地址就可以使用;检查针对解析后的地址,而非名称。
确实需要向自身网络内部投递的自托管部署,可在 Editor 服务上将 seatmap.webhooks.allow-private-targets 设为 true。这会关闭地址检查,因此仅应在整个网络路径都由您控制时启用。
如果接收器仅支持普通 http,还需将 seatmap.webhooks.allow-insecure-targets 设为 true。两个设置必须同时启用;仅启用后者属于配置错误,Editor 服务将无法启动。
即使两个设置均启用,http 目标仍仅限内部网络:主机解析出的所有地址都必须是私有或其他不可公开路由的地址。因此 http://receiver.internal:8080/hook 可以使用,而公共 http 地址会被拒绝。http 流量在传输中不加密,因此有此范围限制。
重试
投递失败时使用指数退避重试,默认重试三次。默认值如下:
| 设置 | 默认值 | 含义 |
|---|---|---|
timeoutMs |
30000 |
每次尝试的超时时间。 |
maxRetries |
3 |
首次尝试之后的重试次数。 |
backoffInitialMs |
1000 |
首次重试前的延迟。 |
backoffMultiplier |
2.0 |
后续每次延迟的乘数。 |
retryOnHttpStatuses |
500, 502, 503, 504 |
需要重试的状态码。 |
skipRetryOnHttpStatuses |
400, 401, 403, 404 |
视为最终结果、不重试的状态码。 |
超时、网络错误和连接错误会重试。TARGET_NOT_ALLOWED 不重试,因为目标无效,等待不会改变结果。最后一次重试失败后,事件进入死信列表,不会被静默丢弃。
投递尝试保存的信息
每次尝试都会记录状态、错误类型和响应正文片段,您无需改造自己的端点就能查看失败原因。
可能包含凭据的响应头以 [redacted] 保存:authorization、proxy-authorization、set-cookie、set-cookie2、www-authenticate、proxy-authenticate 和 x-amz-security-token。如果端点在这些头中回显令牌,令牌不会出现在投递日志中。