当使用Hyper进行请求时,如何设置User-Agent头?

3

我想使用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);
}

1
请在寻求解决错误时,附上您遇到的错误信息 - Shepmaster
2个回答

4
也许你遇到了这种错误?
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() 方法解决该问题。

1

在更新的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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接