2017-04-05 27 views
5

Zauważyłem, że Rust nie ma wbudowanej biblioteki do obsługi HTTP, ma tylko moduł net, który zajmuje się protokołami IP i TCP.Jak utworzyć żądanie GET w Rust?

muszę wziąć &str adresu URL, zrobić żądania HTTP GET, i jeśli udany powrót albo String lub &str że odpowiada HTML lub JSON lub innej reakcji w postaci łańcucha.

To będzie wyglądać następująco:

use somelib::http; 

let response = http::get(&"http://stackoverflow.com"); 
match response { 
    Some(suc) => suc, 
    None => panic! 
} 
+0

Czy próbowałeś googlować do skrzynek http? Na przykład [to może działać dla ciebie] (https://github.com/alexcrichton/curl-rust). – user4815162342

+2

Tego typu pytanie jest nie na temat w Stack Overflow, więc prawdopodobnie zostanie zamknięte. Jeśli do tej pory nie znalazłeś odpowiedzi, zapraszam do przejrzenia sekcji wiki tagu Rust [Uzyskiwanie pomocy] (http://stackoverflow.com/tags/rust/info), która zawiera informacje o innych miejscach na pytania otwarte. –

Odpowiedz

5

Spójrz na Hyper.

Wysyłanie żądania GET jest tak proste jak to.

let client = Client::new(); 

let res = client.get("http://example.domain").send().unwrap(); 
assert_eq!(res.status, hyper::Ok); 

Możesz znaleźć więcej przykładów w documentation.

Edit: Wydaje się, że Hyper się trochę bardziej skomplikowana, ponieważ zaczęli używać Tokio. Oto zaktualizowana wersja.

extern crate futures; 
extern crate hyper; 
extern crate tokio_core; 

use std::io::{self, Write}; 
use futures::{Future, Stream}; 
use hyper::Client; 
use tokio_core::reactor::Core; 


fn main() { 
    let mut core = Core::new().unwrap(); 
    let client = Client::new(&core.handle()); 

    let uri = "http://httpbin.org/ip".parse().unwrap(); 
    let work = 
     client.get(uri).and_then(|res| { 
      println!("Response: {}", res.status()); 

      res.body().for_each(|chunk| { 
       io::stdout() 
        .write_all(&chunk) 
        .map_err(From::from) 
      }) 
     }); 
    core.run(work).unwrap(); 
} 

A tutaj są wymagane zależności.

[dependencies] 
futures = "0.1" 
hyper = "0.11" 
tokio-core = "0.1" 
+7

To już nie działa, ponieważ 'hyper :: Client :: new' pobiera argumenty obsługi. – marmistrz

2

Obecny najlepsze praktyki dla tego konkretnego problemu jest użycie reqwest skrzynię, jak określono in the Rust Cookbook:

extern crate reqwest; 

use std::io::Read; 

fn run() -> Result<()> { 
    let mut res = reqwest::get("http://httpbin.org/get")?; 
    let mut body = String::new(); 
    res.read_to_string(&mut body)?; 

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

    Ok(()) 
} 

Jak wspomina książka kucharska, to kod będzie wykonywany synchronicznie.

+0

Czy próbowałeś go uruchomić? Nie mogę tego skompilować, rustc 1.19.0 –

+0

Niestety reqwest wymaga OpenSSL, więc nie jest dobrze, jeśli robisz cross-kompilację –