如何在 Rust 中的 wasm_bindgen 函数中发出 HTTP 请求?

How do I make an HTTP request within a wasm_bindgen function in Rust?

我正在开发一个使用 Rust 和 wasm-pack 编译的 NODE JS 包,我需要在我的代码中发出 HTTP 请求。我尝试使用 reqwest 库,所以在测试中一切正常,但我在打包时遇到错误。

#![allow(non_snake_case)]

use reqwest;
use wasm_bindgen::prelude::*;

// function
#[wasm_bindgen]
pub fn makeGetRequest(url: &str) -> String {
    let mut resp = reqwest::get(url).unwrap();
    resp.text().unwrap()
}

// test
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_makeGetRequest() {
        let url = "https://whosebug.com/";
        let body = makeGetRequest(url);
        assert!(body.len() > 0);
    }
}

配置Cargo.toml

...

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
reqwest = "0.9"

我用命令打包项目:

wasm-pack build --release --target nodejs

我得到错误:

...
error: could not compile `net2`

我发现 wasm-pack 似乎不支持 net2,所以我可能无法使用 reqwestwasm-pack build report error: could not compile `net2`

有没有一种方法可以成功地发出可以用 wasm-pack 打包的同步 HTTP 请求?

它不会像您预期的那样容易工作:WASM 字节码在受保护的环境中执行,无法访问 OS 功能,如磁盘、网络、传统随机生成器和任何其他类型的 I/O。因此,当您将任何使用此类功能的 Rust 代码编译到 Wasm 中时,它将无法运行。

不幸的是,您的代码(例如文件访问)通常甚至会静默编译,然后在运行时以神秘的方式失败。这不是您习惯使用 Rust 的方式,也是当前 Wasm Rust 堆栈的主要缺点。

要访问 OS 功能,您需要 WASI (Wasm System Interface) as an extension. To enable Wasi in NodeJs, you can use something like WasmerJs, see e.g. this article 提供简短摘要。