【问题标题】:Is it possible to get both the text and the JSON of a response from reqwest是否可以同时获取来自 reqwest 的响应的文本和 JSON
【发布时间】:2022-08-03 22:35:42
【问题描述】:

从 reqwest 文档中,您可以从请求响应中获取 deserialized jsonbody text

我看不到的是如何同时获得它们。我的要求是我希望解码后的 json 在代码中使用,但想打印出文本以进行调试。不幸的是,由于这两个函数都获得了请求的所有权,因此尝试获取两者都会给您一个关于使用移动值的错误。似乎也无法克隆请求。

这是我希望能够做的事情的一个例子,但是第 4 行是无效的,因为它使用了在第 1 行移动的响应。

let posts: Vec<Post> = match response.json::<PostList>().await {
    Ok(post_list) => post_list.posts,
    Err(e) => {
        let text = response.text().await.unwrap();
        println!(\"Error fetching posts: {}, {}\", e, text);
        Vec::new()
    }
}; 
  • Response::json() method 实际上只是获取响应正文的字节,然后在其上调用 serde_json::from_slice。是什么阻止你做同样的事情?获取text(),将其打印出来,然后将文本反序列化为 JSON。
  • 作为替代方案,您也可以直接打印posts 对象,假设它实现了DebugDisplay

标签: rust reqwest


【解决方案1】:

json()text() 不能在同一个响应上调用的原因是这两种方法都必须读取整个响应流,并且只能执行一次。

您最好的选择是首先将其读入String,然后从该字符串中解析 JSON:

let response_text = response.text().await.unwrap();
let posts: Vec<Post> = match serde_json::from_str::<PostList>(&response_text) {
  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2021-09-03
    • 2015-09-11
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多