【问题标题】:How to actually get the text of the response body in WASM-Bindgen and Rust如何在 WASM-Bindgen 和 Rust 中实际获取响应正文的文本
【发布时间】:2020-05-03 21:25:18
【问题描述】:

也许这是一个简单的问题,但我还没有在任何地方找到答案。我已经搜索了文档,但是我在整个互联网上找到的用于 web-sys fetch 的单个示例仍然没有解决这个问题(官方文档,不少于)。

如何从 web-sys 请求中获取响应正文?它具有 JsFutures 和展开的所有这些开销,我实际上似乎无法找到正确的方法来将我的数据放入字符串中。我只是试图从(本地主机开发)服务器检索文件,然后将其解析为 WebGL 程序的顶点着色器,但我什至无法获取它的字符串或以任何方式从中读取。

【问题讨论】:

    标签: rust wasm-bindgen


    【解决方案1】:

    Response 类型上有一个body 方法,参见https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Response.html#method.body

    还有一个text 方法返回一个Promise,它会解析成一个JsValue

    https://rustwasm.github.io/wasm-bindgen/examples/fetch.html为例

    你应该可以做这样的事情:

    let mut opts = RequestInit::new();
    opts.method("GET");
    opts.mode(RequestMode::Cors);
    
    let request = Request::new_with_str_and_init(
        "https://api.github.com/repos/rustwasm/wasm-bindgen/branches/master",
        &opts,
    )?;
    
    request
        .headers()
        .set("Accept", "application/vnd.github.v3+json")?;
    
    let window = web_sys::window().unwrap();
    let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?;
    
    // `resp_value` is a `Response` object.
    assert!(resp_value.is_instance_of::<Response>());
    let resp: Response = resp_value.dyn_into().unwrap();
    
    // Convert this other `Promise` into a rust `Future`.
    let text = JsFuture::from(resp.text()?).await?.as_string().unwrap();
    

    【讨论】:

    • 效果很好,谢谢! JsValues 可以转换为字符串,但只能在等待然后展开之后。我认为那是我犯的错误。对我来说,看起来有很多样板代码用于一个库,表面上是为了帮助 JS 互操作性,但考虑到 Javascript 的异步特性,也许它是有意的。
    • 也许你有兴趣使用 stdweb github.com/koute/stdweb 有更多惯用的 rust 用法
    • 也许检查 resp.ok() 以确保它不是 404 或缺少身份验证。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2020-09-11
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多