实现飞书群推送报错接口,critical复现curl

1.成果展示

Nacos 配 Webhook + 卡片内 Apifox 风格 curl(含 query / body / 响应 JSON)

左图apifox右图飞书群


2. 请求体有 Content-Type 却无 body的解决方法

text 复制代码
客户端(Apifox) → Gateway(Netty) → api-app(Tomcat) → GlobalExceptionHandler → 飞书
断点 现象 处理
Gateway GET/DELETE 带 body 时默认路由可能不转发 body ReproduceBodyPreserveGlobalFilter:join body 再装饰 getBody() + Content-Length
Tomcat GET 的 InputStream读不到 body(业务也不读) 网关读完后写内网头 X-Brain-Reproduce-Body-B64(≤24KB);api-app 解码写入 TraceContext
双层 Wrapper RequestTrace 内层有缓存,PlaintextDebugCapture 再包一层空外壳 不再往ContentCachingRequestWrapperreadCachedBody 沿链向内找;优先 TraceContext 字节快照

3. Apifox body 类型 → curl 片段

Body curl
Query 已在 URL ?key=value
JSON --data-raw '{"k":1}'(紧凑 JSON)
x-www-form-urlencoded --data-raw 'a=1&b=2'
multipart/form-data 解析 boundary → 多行 --form 'name="value"';文件用 --form 'f=@文件名'

实现:ReproduceRequestBodyCapture(字节+Content-Type) → MultipartFormParser / ApifoxCurlBodyAppender

预热:RequestTraceServletFilter 对「有 Content-Length / chunked / 有 Content-Type」尝试 readAllBytes();multipart 必须用字节,别先转 String。


4. 飞书展示层

问题 原因 处理
Accept: */*Accept: / 卡片 Markdown 吃掉 * 推送前 FeishuMarkdownEscaper\*
Connection 经网关常无此头 缺省补 keep-alive
--form 见 §2 body 未到 api-app 网关 relay + multipart 解析

对外 URL:X-Forwarded-Host / X-Forwarded-Protoxxx.xxxx.com,别用内网。


5. 避坑和安全设计

  • 发 dev不要用tar命令覆盖 ECS的配置文件.env(不然会把 NACOS_PASSWORD 冲成 nacos → 全链 403)。
  • reproduceBlock 可含 Authorization (仅飞书 critical,不进security_log 明文)。
相关推荐
金金金__12 小时前
腾讯云直连COS优化:CDN 接入
后端
爱勇宝12 小时前
《道德经》第5章:生产环境不相信眼泪
前端·后端·架构
掘金者阿豪12 小时前
LEFT JOIN 凭空消失的背后,是优化器偷偷帮你做了决定
前端·后端
阿维的博客日记12 小时前
spring里面的@RequestParam什么意思
java·后端·spring
金金金__12 小时前
腾讯云COS接入配置
后端
Hyyy13 小时前
Git Worktree 完全讲解
前端·后端·面试
逝水无殇13 小时前
C# 反射详解
开发语言·后端·c#
Cache技术分享13 小时前
465. Java 反射 - 获取类的简单名
前端·后端
做系统的大强13 小时前
REPL里的HLT:main_stmts为空时的致命尾声
后端
薛定谔的悦13 小时前
光伏-储能-负荷联合预测:给 EMS 装上"预知能力"
后端