实现飞书群推送报错接口,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 明文)。
相关推荐
凤山老林13 小时前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅13 小时前
Spring 核心原理
java·后端·spring
用户9385156350713 小时前
掘金风格后端数据库设计实战:从用户表到分布式架构,一文搞定
后端·sql
拾光师14 小时前
Hadoop 三种运行模式:从单机调试到生产集群,一路搭过来
后端
进阶的小名14 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt
卷无止境14 小时前
FastAPI 的 Metadata 到底是什么,又牵动了哪些核心概念
后端·python
卷无止境14 小时前
FastAPI 调试实战,从断点到生产环境的排错心法
后端·python
敢敢のwings15 小时前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
考虑考虑15 小时前
Java三元表达式注意
java·后端·java ee
stark张宇16 小时前
Go语言runtime全景图:从编译到GC,带你彻底吃透Go的底层血脉
后端·go