【问题标题】:How do I set the User-Agent header when making a request with Hyper?使用 Hyper 发出请求时如何设置 User-Agent 标头?
【发布时间】:2017-10-17 07:13:25
【问题描述】:

我正在尝试使用 Hyper 库在 Rust 中向 Github 的 API 发出 GET 请求,并在标头中使用用户代理字符串。我没有运气使用.header(UserAgent("string")) 进行编译。有人愿意提出一种惯用的方式来完成我想要的吗?

extern crate hyper;

use std::io::Read;

use hyper::Client;
use hyper::header::{Connection, Headers};

struct Subtasks {
    github: &'static str,
}

struct Tasks {
    rust: Subtasks,
    go:   Subtasks,
}

fn main() {
    // initialize struct and populate
    let tasks = Tasks {
        rust: Subtasks {
            github: "https://api.github.com/rust-lang/rust",
        },
        go: Subtasks {
            github: "https://api.github.com/golang/go",
        },
    };

    let client = Client::new();
    let mut result = client.get(tasks.rust.github)
        .header(Connection::close())
        .send()
        .unwrap();

    let mut body = String::new();
    result.read_to_string(&mut body).unwrap();

    println!("Response: {}", body);
}

【问题讨论】:

  • 包括错误您在请求帮助解决错误时遇到的错误。

标签: rust hyper


【解决方案1】:

也许你遇到了这种错误?

src/main.rs:31:20: 31:28 error: mismatched types:
 expected `collections::string::String`,
    found `&'static str`
(expected struct `collections::string::String`,
    found &-ptr) [E0308]
src/main.rs:31  .header(UserAgent("string"))

如果是这样,您可以使用它来工作

.header(UserAgent("string".to_string()))

并将UserAgent 纳入范围

use hyper::header::{Connection, Headers, UserAgent};

问题可能在于在构造标头时使用字符串文字而不是String,这可以通过在字符串文字上调用to_string() 方法来解决。

【讨论】:

    【解决方案2】:

    使用更新的 hyper 0.11,您可以像这样设置用户代理:

    let mut req = hyper::Request::new(hyper::Method::Get, url);
    req.headers_mut().set(UserAgent::new("my agent"));
    

    转换为以下依赖项:

    hyper = "0.11"
    hyper-tls = "0.1"
    tokio-core = "0.1"
    futures = "0.1"
    

    因此,整个示例将是:

    extern crate hyper;
    extern crate hyper_tls;
    extern crate tokio_core;
    extern crate futures;
    
    use std::io::{self, Write};
    
    use futures::Future;
    use futures::stream::Stream;
    
    use hyper::Client;
    use hyper::header::UserAgent;
    
    struct Subtasks {
        github: &'static str,
    }
    
    struct Tasks {
        rust: Subtasks,
        go:   Subtasks,
    }
    
    fn main() {
        // initialize struct and populate
        let tasks = Tasks {
            rust: Subtasks {
                github: "https://api.github.com/rust-lang/rust",
            },
            go: Subtasks {
                github: "https://api.github.com/golang/go",
            },
        };
    
        let mut core = tokio_core::reactor::Core::new().unwrap();
        let handle = core.handle();
        let client = Client::configure()
            .connector(hyper_tls::HttpsConnector::new(4, &handle).unwrap())
            .build(&handle);
    
        let url = tasks.rust.github.parse::<hyper::Uri>().unwrap();
        let mut req = hyper::Request::new(hyper::Method::Get, url);
        req.headers_mut().set(UserAgent::new("my agent"));
    
        let work = client.request(req).and_then(|res| {
            print!("Response: ");
            res.body().for_each(|chunk| {
                io::stdout().write_all(&chunk).map_err(From::from)
            })
        });
    
        core.run(work).unwrap();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2013-03-31
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多