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

WebAssembly发送无效JSON请求体,Actix Web无法反序列化

问题解决:WebAssembly发送POST请求无法被Actix Web反序列化

问题根源

你用serde_wasm_bindgen::to_value(&req)得到的是JS对象(JsValue类型),直接传给fetch的body参数时,浏览器会自动调用对象的toString()方法,最终发送的请求体内容是"[object Object]"——这根本不是合法的JSON格式,所以Actix Web服务器无法反序列化,抛出expected value的错误。而curl发送的是标准JSON字符串,所以能正常处理。

修复步骤

1. 将JS对象转为JSON字符串

需要借助js_sys::JSON::stringify把serde_wasm_bindgen生成的JS对象转换成标准JSON字符串,再作为请求体发送。

2. 确保请求头正确设置Content-Type

必须在请求头里明确指定Content-Type: application/json,告诉服务器接收的是JSON格式数据。

修改后的Wasm代码

use js_sys::JSON;
use wasm_bindgen::JsValue;
use web_sys::{Headers, RequestInit, Window};

// 假设你已经定义了req变量和ok回调函数
let window = web_sys::window().unwrap();

// 1. 设置请求头
let headers = Headers::new().unwrap();
headers.append("Content-Type", "application/json").unwrap();

// 2. 序列化请求体:Rust结构体 → JS对象 → JSON字符串
let req_js_value = serde_wasm_bindgen::to_value(&req).unwrap();
let json_body_str = JSON::stringify(&req_js_value).unwrap();
let request_body = JsValue::from_str(&json_body_str);

// 3. 发送请求
let _ = window
    .fetch_with_str_and_init(
        "/api",
        &RequestInit::new()
            .method("POST")
            .headers(&headers)
            .body(Some(&request_body))
    )
    .then(&ok);

验证修复

按以下步骤重新测试:

  • 执行wasm-pack build --target web wasm重新编译WebAssembly
  • 执行cargo run启动服务器
  • 访问http://localhost:8080触发请求,此时服务器应该能正常解析请求体,返回200响应

内容的提问来源于stack exchange,提问作者Siriusmart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:37:23