rust - 如何在reqwest中获取“解码失败”错误中的响应正文?

标签 rust actix-web rust-actix

目前,我只能收到错误消息error decoding response body: expected value at line 1 column 1
显然,错误的原因是httpbin.org返回了HTML。我想知道如何将HTML返回给客户端。

use actix_web::{get, App, Error, HttpResponse, HttpServer};
use reqwest;
use std::collections::HashMap;

#[get("/")]
async fn index() -> Result<HttpResponse, Error> {
    let res = reqwest::get("https://httpbin.org/404")
        .await
        .expect("Get request failed");

    match res.json::<HashMap<String, String>>().await {
        Ok(resp) => Ok(HttpResponse::Ok().json(resp)),
        Err(e) => {
            println!("{:?}", e);
            Err(Error::from(HttpResponse::BadRequest().body(e.to_string())))
        }
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(index))
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

最佳答案

actix_webResponse::json定义为:

pub async fn json<T: DeserializeOwned>(self) -> Result<T>
由于它按值获取self,因此消耗了响应,因此无法访问它。
因此,为了保持对响应主体的访问,您需要自己对它进行反序列化,以确保仍然可以访问并且不使用响应主体。
这很容易,因为Response::jsona very short helper:
pub async fn json<T: DeserializeOwned>(self) -> crate::Result<T> {
    let full = self.bytes().await?;

    serde_json::from_slice(&full).map_err(crate::error::decode)
}
由于serde不会占用响应主体,因此您所要做的就是保留Response::bytes的结果,然后就可以进一步使用它了。
虽然对我来说,如果您正在调用的端点可能将not-json返回到要求json的请求中:
  • 您应该调查为什么? (待定,当您专门查询站点的404时,我看不到为什么它会返回json?)
  • 您应该能够检查响应的内容类型
  • 关于rust - 如何在reqwest中获取“解码失败”错误中的响应正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64421538/

    相关文章:

    debugging - 如果条件命中两次,则在下面的 rust 代码中

    rust - 如何在 actix-web 中接收多个具有相同名称的查询参数?

    rust - 如何在 actix-web 中执行异步函数?

    postgresql - 如何在Rust上使用Actix创建POST方法?

    asynchronous - 如何使用rlua-async执行异步lua代码?

    rust - 在actix线程中进行同步http客户端访存

    generics - 特质与通用特质绑定(bind)

    rust - 我的 C FFI 中的 f64 应该使用哪种 C 类型?

    rust - 闭包需要对 `self` 的唯一访问权,但它已被借用

    rust - 两个使用者如何使用actix字段流?