rust Web程序集发送服务器无法反序列化的错误Json正文

mwyxok5s  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(177)

问题

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实际上向服务器发送一个好的请求。

bvuwiixz

bvuwiixz1#

serde_wasm_bindgenReq序列化为JS对象,这就是fetch()得到的。我认为它在上面调用toString(),结果是[object Object](不完全确定),但这肯定不是发送JSON。
您需要自己将数据序列化为JSON,例如通过serde_json然后调用JsValue: From<String>,或者通过serde_wasm_bindgen将其序列化为JS对象,然后对其调用JSON.stringify()

相关问题