部署的KrakenD-Django微服务无法接收JSON请求体数据
问题:Django+KrakenD部署后POST请求数据无法到达后端服务
问题现象
所有端点状态正常,但POST请求提交的JSON数据无法传递到Django服务,本地环境运行正常,仅部署实例存在该问题。
请求示例
curl --location 'https://backend-dev-url.com/api/v1' \ --header 'Content-Type: application/json' \ --data '{ "a":"value", "b":"value" }'
收到的响应
{ "a": [ "This field is required." ], "b": [ "This field is required." ] }
当前KrakenD配置片段
{ "endpoint": "api/v1", "method": "POST", "output_encoding": "no-op", "backend": [ { "url_pattern": "api/v1", "encoding": "no-op", "sd": "static", "method": "POST", "host": ["http://localhost:8000"], "disable_host_sanitize": false } ], "input_headers": ["Authorization","Content-Type"], "extra_config": { "qos/ratelimit/router": { "max_rate": 100, "client_max_rate": 60, "every": "1m", "strategy": "ip" } } }
解决方案
问题源于KrakenD默认不会自动转发原始请求体,需显式配置开启该功能。修改配置如下:
- 在端点层级添加
"input_body": "raw",指定网关直接转发原始请求体 - 保留后端的
"encoding": "no-op",避免对请求体进行额外转换
修改后的配置片段:
{ "endpoint": "api/v1", "method": "POST", "output_encoding": "no-op", "input_body": "raw", "backend": [ { "url_pattern": "api/v1", "encoding": "no-op", "sd": "static", "method": "POST", "host": ["http://localhost:8000"], "disable_host_sanitize": false } ], "input_headers": ["Authorization","Content-Type"], "extra_config": { "qos/ratelimit/router": { "max_rate": 100, "client_max_rate": 60, "every": "1m", "strategy": "ip" } } }
原因说明:KrakenD默认会对请求做聚合或格式转换,未配置input_body: raw时,不会将客户端提交的原始JSON请求体转发给Django后端,导致Django无法获取数据,触发字段必填的校验错误。本地环境因为直接访问Django服务,未经过网关转发,所以功能正常。
内容的提问来源于stack exchange,提问作者Geo Joseph
相关产品推荐
相关产品推荐

