Azure容器应用中Dapr调用POST请求体为空问题求助
解决方案建议
1. 修正Dapr服务调用的URL路径
当前的Dapr服务调用URL不符合官方HTTP API规范,这是请求体丢失的核心原因。Dapr服务调用必须使用/v1.0/invoke/<app-id>/method/<endpoint>格式的路径。
修改Expense Service中的fetch请求URL:
const resp = await fetch(`${DAPR_HOST}:${DAPR_HTTP_PORT}/v1.0/invoke/notification-service/method/test`, { method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify(body), });
注意:标准调用路径中无需dapr-app-id请求头,目标应用ID已通过URL路径指定。
2. 移除自定义的Fastify JSON内容解析器
你在Notification Service中自定义的JSON解析器(设置parseAs: "string"),可能与Dapr转发请求时的内容处理逻辑冲突。Fastify默认已提供完善的JSON解析能力,无需自定义。
删除以下代码块:
fastify.addContentTypeParser( "application/json", { parseAs: "string" }, function (req, body: any, done) { try { // console.log("RAW: ", body); console.log("wtf"); done(null, body); } catch (err: any) { err.statusCode = 400; done(err, undefined); } } );
移除后,Fastify会自动将JSON请求体解析为JavaScript对象,你可直接从request.body获取解析后的数据。
3. 验证Azure容器应用的Dapr配置
- 确认两个服务的Dapr Sidecar已正确启用:Azure容器应用配置中
DAPR_ENABLED需设为true - 检查Dapr Sidecar日志,排查请求转发时是否存在请求体解析失败、长度不匹配等错误提示
- 确保服务端口配置一致:Expense Service监听3000、Notification Service监听3001,且Azure容器应用的
TARGET_PORT与服务端口对应
4. 测试调整后的代码
修改完成后重新部署到Azure容器应用,测试/expense/new接口,此时Notification Service的request.body应能正常接收JSON数据。
内容的提问来源于stack exchange,提问作者Yick Kiu Liam Leung
相关产品推荐
相关产品推荐

