实现飞书群推送报错接口,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 明文)。
相关推荐
有梦不弃3 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构
江南十四行7 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
IT_陈寒8 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
妙码生花8 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十二):管理员权限检查中间件,AI 随意放行预闯大祸
前端·后端·go
创安电气研究所8 小时前
用 Node.js 将变频器运行数据接入 MQTT
后端
董员外8 小时前
RAG 系统进化论(八):Agentic RAG(智能体式 RAG),从回答问题到完成任务
人工智能·后端·设计模式
大勇前进9 小时前
告别 div 满天飞,HTML5 语义化标签真的有必要用吗?
后端
小满zs9 小时前
Go语言第六章(结构体)
后端·go
属于自己的天空9 小时前
每天省去重复 Prompt:我用 Skills 把 CRUD 生成标准化了
前端·后端