【问题标题】:Adding Headers to a GET Call将标头添加到 GET 调用
【发布时间】:2024-09-30 20:55:01
【问题描述】:

我是 Rust 新手,正在尝试使用 reqwest crate 调用 API。 我希望我的代码;

  1. 在 GET 请求中包含“Content-Disposition: Inline”标头。
  2. 以文本形式返回并打印 JSON

我不确定自己做错了什么,希望有人能帮我找出原因。

该请求在 JS 和 Postman 中对我来说很好,并返回数组 JSON 数据, 同样在我的 RUST 代码中,请求返回 200 成功。

但是我看不到响应数据 & 远程服务器以 "Content-Disposition" 标头默认值响应(不是我指定的“内联”)。

我的 Rust 代码编译良好,似乎发送正常:

extern crate reqwest;
use reqwest::header::HeaderName;
use reqwest::header::HeaderValue;
use reqwest::header::ACCEPT;
use reqwest::header::CONTENT_DISPOSITION;

fn main() {
    let client = reqwest::Client::new();
    let response_text = client
        .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
        .header(CONTENT_DISPOSITION, "inline")
        .header(ACCEPT, "*/*")
        .send()
        .unwrap();

    println!("Response Text: {:#?}", response_text);
}

我在控制台中收到的上述请求的响应是:

Response Text: Response {
  url: "http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic",
  status: 200,
  headers: {
    "date": "Tue, 22 Oct 2019 06:33:45 GMT",
    "server": "Apache/2.4.6 (CentOS) PHP/5.4.16 mod_wsgi/3.4 Python/2.7.5",
    "content-disposition": "attachment; filename=NEMLOG.json",
    "transfer-encoding": "chunked",
    "content-type": "text/json; name=\"NEMLOG.json\"",
  },
}

我希望看到的输出是调用的内联响应,如下所示:

{"SETTLEMENTDATE":"2019-10-22T10:45:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":91.272}
{"SETTLEMENTDATE":"2019-10-22T10:50:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":75.7859}
{"SETTLEMENTDATE":"2019-10-22T10:55:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":74.8683}
{"SETTLEMENTDATE":"2019-10-22T11:00:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":25.14}
{"SETTLEMENTDATE":"2019-10-22T11:05:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":16.4812}
{"SETTLEMENTDATE":"2019-10-22T11:10:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":56.4572}
{"SETTLEMENTDATE":"2019-10-22T11:15:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":38.5679}
{"SETTLEMENTDATE":"2019-10-22T11:20:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":47.5941}
{"SETTLEMENTDATE":"2019-10-22T11:25:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":25.14}
{"SETTLEMENTDATE":"2019-10-22T11:30:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":51.8465}
{"SETTLEMENTDATE":"2019-10-22T11:35:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":71.7957}
{"SETTLEMENTDATE":"2019-10-22T11:40:00Z","REGIONID":"VIC1","RRP.DISPATCHPRICE0":72.0757}

【问题讨论】:

    标签: rust reqwest


    【解决方案1】:

    send 是惰性的:它在收到回复标头后立即返回,而无需等待正文。您可以使用text 方法获取文本,该方法确实会等到接收到全文,或者您可以使用Read 实现来分块处理它:

    let mut response = client
        .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
        .header(CONTENT_DISPOSITION, "inline")
        .header(ACCEPT, "*/*")
        .send()
        .unwrap();
    
    println!("Response: {:#?}", response);
    println!("Response text: {}", response.text().unwrap());
    

    至于回复的content-disposition,您确定您的服务器尊重content-disposition 标头吗?你能检查一下你用 JS 和 Postman 得到的响应头吗?

    【讨论】:

    • 谢谢奥马尔。我设法解决了这个问题,这是你和彼得所描述的结合,非常感谢。
    【解决方案2】:

    感谢彼得和奥马尔。

    我设法解决了这个问题,答案是综合了您的建议。 我需要将以下内容添加到要发送的代码中,解开响应然后运行 ​​text 方法:

    .send()
    .unwrap()
    .text();
    

    非常感谢!

    【讨论】:

      【解决方案3】:

      我对 rust 和 reqwest 没有深入的了解,但据我所知,您将 Response 对象转换为文本并打印没有消息正文或有效负载的 Response 结构。通过在 Google 上的快速搜索,我找到了属于 Response 对象的方法 text(),它应该为您提供有效负载。

      这里是链接: https://docs.rs/reqwest/0.8.4/reqwest/struct.Response.html

      这可能是一个解决方案:

      extern crate reqwest;
      use reqwest::header::HeaderName;
      use reqwest::header::HeaderValue;
      use reqwest::header::ACCEPT;
      use reqwest::header::CONTENT_DISPOSITION;
      
      fn main() {
          let client = reqwest::Client::new();
          let response_text = client
              .get("http://nemlog.com.au/show/1h/NEMLOG.json?id1=RRP.DISPATCHPRICE0&k1=vic")
              .header(CONTENT_DISPOSITION, "inline")
              .header(ACCEPT, "*/*")
              //.send() <-- it seems that you do not have to send explicitly
              .text();  // <-- !!!!!!! Change
      
          println!("Response Text: {:#?}", response_text);
      }
      

      【讨论】:

      • 我对我的答案投反对票没有问题。但我看不出有什么问题。我不是铁锈大师,但我可以阅读手册。它对 OP 很有用。那么,为什么将此答案标记为不有价值并阻止其他人获得有用的信息或链接呢?如果有错误,为什么要投反对票。你为什么不写评论有什么问题并帮助别人。从我的角度来看:我收到一条消息,说我的答案有问题,但我不知道它是什么。
      最近更新 更多