You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:57:03