问题
Webassembly正在向actixweb服务器发送post请求,但actixweb表示无法反序列化JSON主体。
在终端(用于actixweb)中,您可以看到
Failed to deserialize Json from payload. Request path: /api
Error in response: Deserialize(Error("expected value", line: 1, column: 2))
在javascript控制台中
Response { url: "http://localhost:8080/api", status: 400, statusText: "Bad Request", /* ... */ }
我试过用curl发送同样的请求,而且成功了,所以很明显wasm发送的请求有问题,但我不确定是什么问题
curl --header "Content-Type: application/json" \ :(
--request POST \
--data '{"field1": "one", "field2": "two", "field3": "three"}' \
http://localhost:8080/api
下面是发送请求的代码(Web程序集)
let _ = window
.fetch_with_str_and_init("/api", &RequestInit::new().method("POST").headers(&headers).body(Some(&serde_wasm_bindgen::to_value(&req).unwrap())))
.then(&ok);
这是接收请求的服务器
#[post("/api")]
async fn api(body: Json<Req>) -> String {
format!("{body:?}")
}
#[derive(Debug, Deserialize)]
struct Req {
field1: String,
field2: String,
field3: String,
}
以下是如何重现该问题:
repo
git clone https://github.com/Siriusmart/dummy-repo-for-asking-stackoverflow
wasm-pack build --target web wasm
首先重新编译Web程序集
然后cargo run
启动服务器
访问http://localhost:8080以查看wasm的站点。
当按钮被按下时,应该会有输出到js控制台,说这是一个错误的请求,同时在actix web控制台也会有一个错误消息。
我们的目标是使它能够让wasm实际上向服务器发送一个好的请求。
1条答案
按热度按时间bvuwiixz1#
serde_wasm_bindgen
将Req
序列化为JS对象,这就是fetch()
得到的。我认为它在上面调用toString()
,结果是[object Object]
(不完全确定),但这肯定不是发送JSON。您需要自己将数据序列化为JSON,例如通过
serde_json
然后调用JsValue: From<String>
,或者通过serde_wasm_bindgen
将其序列化为JS对象,然后对其调用JSON.stringify()
。