【问题标题】:How to get raw HttpResponse using Hyper or Reqwest?如何使用 Hyper 或 Reqwest 获取原始 HttpResponse?
【发布时间】:2020-07-14 00:25:46
【问题描述】:

有没有办法在执行reqwest::get("https://httpbin.org/ip").send().await? 之后获得实际/原始/原始 http 响应

或来自超:client.get("https://httpbin.org/ip".parse()?).await?

我需要一个类似于邮递员返回的结果:

Date: Mon, 13 Jul 2020 07:43:46 GMT
Content-Type: application/json
Content-Length: 33
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
  "origin": "102.200.212.40"
}

不知何故,reqwest 将响应组织得太好了;进入version()status()headers()等。

我之所以特别提到 reqwest 和/或 hyper,是因为它们在代码中被广泛使用。在我们尝试另一个 crate/lib 之前,我希望我仍然可以使用它们。

【问题讨论】:

  • 嗨@Stargateur 我实际上需要原始响应的大小;而不仅仅是标题,:(
  • 我不认为 hyper 和 request 可以做到这一点,而且,这是一个非常奇怪的请求
  • @Stargateur,不确定您是否觉得奇怪的是获得原始 http 响应的问题...?
  • 两者都很奇怪

标签: post rust get hyper reqwest


【解决方案1】:

@B.CarlaYap 实际上你的问题是不可理解的.. 你能更新并添加你正在拨打的邮递员电话的确切显示吗?您也在查看可以从 Response 获得的 HEADER。

您可以使用更容易理解的 Blocking。

reqwest = {version = "0.10.8", features = ["blocking", "json"]}


fn main() -> Result<(), Box<dyn std::error::Error>> {

    println!("GET https://www.rust-lang.org");

    let mut res = reqwest::blocking::get("https://www.rust-lang.org/")?;

    println!("Status: {}", res.status());
    println!("Headers:\n{:?}", res.headers());

    // copy the response body directly to stdout
    res.copy_to(&mut std::io::stdout())?;

    println!("\n\nDone.");
    Ok(())
}

【讨论】: