2016-01-03 22 views
1

我試圖做一個GET請求到Github的Rust與超級庫,並在頭中的用戶代理字符串的API。我沒有運氣編譯.header(UserAgent("string"))。任何人都願意提出一種慣用的方式來實現我想要的嗎?如何在使用Hyper發出請求時設置User-Agent標題?

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

回答

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

隨着最近超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(); 
} 
相關問題