actix-web JSON解析异常:接收结构体请求返回400错误问题问询
400错误根因及修复方案
核心问题1:第一个接口参数提取逻辑错误,返回非法JSON结构
actix-web中String类型作为请求提取器时,会直接读取整个原始请求体的纯文本内容,不会自动做JSON反序列化:
- 你测试时传入
json.dumps("hello44444"),请求体实际内容是带双引号的"hello44444" - 这部分带双引号的完整内容直接赋值给了
obj字段,后续序列化MyObj时,会对已经带双引号的内容再次做JSON转义,所以返回结果为{"name":""hello44444""},属于语法非法的JSON,后续解析后传入第二个接口自然会触发参数校验失败的400错误。
核心问题2:请求未指定正确的Content-Type头
actix-web的web::Json提取器默认要求请求头Content-Type为application/json,你用requests.post的data参数传数据时,如果没有手动指定头,requests默认会用application/x-www-form-urlencoded,也会直接触发400错误。
修复代码
Rust端修改
将第一个接口的参数从String改为web::Json<String>,让框架自动完成JSON反序列化,拿到不带额外引号的原始字符串:
#[post("/simple")] pub async fn simple(obj: web::Json<String>) -> impl Responder { MyObj { name: obj.into_inner(), } }
Python端修改
直接用requests的json参数传数据,会自动完成序列化并添加正确的Content-Type头:
def simple(): # testing simple data = "hello44444" r1 = requests.post("http://127.0.0.1:8080/simple", json=data) print(r1.status_code, type(r1.text), r1.text) res = r1.json() r2 = requests.post("http://127.0.0.1:8080/simplerecv", json=res) print(r2.status_code)
内容的提问来源于stack exchange,提问作者Vaibhav D S
相关产品推荐
相关产品推荐

