Как вы делаете запрос GET в Rust?
Я заметил, что у Rust нет встроенной библиотеки для работы с HTTP, у нее есть только модуль net
, который имеет дело с необработанными протоколами IP и TCP.
Мне нужно взять &str
URL-адреса, сделать HTTP-запрос GET и в случае успеха вернуть либо String
, либо &str
, который соответствует HTML или JSON или другому ответу в строковой форме.
Он будет выглядеть примерно так:
use somelib::http;
let response = http::get(&"http://stackoverflow.com");
match response {
Some(suc) => suc,
None => panic!
}
Ответы
Ответ 1
Посмотрите на Hyper.
Отправить запрос GET так же просто, как это.
let client = Client::new();
let res = client.get("http://example.domain").send().unwrap();
assert_eq!(res.status, hyper::Ok);
Вы можете найти больше примеров в документации.
Редактировать: Кажется, что Hyper стал немного сложнее, так как они начали использовать Tokio. Вот обновленная версия.
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();
}
И вот обязательные зависимости.
[dependencies]
futures = "0.1"
hyper = "0.11"
tokio-core = "0.1"
Ответ 2
В настоящее время для решения этой конкретной проблемы reqwest
использовать ящик reqwest
, как указано в Rust Cookbook. Этот код немного адаптирован из поваренной книги для запуска автономно:
extern crate reqwest; // 0.9.18
use std::io::Read;
fn run() -> Result<(), Box<dyn std::error::Error>> {
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(())
}
Как упоминает поваренная книга, этот код будет выполняться синхронно.
Смотрите также:
Ответ 3
Попробуйте перейти на reqwest:
extern crate reqwest;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get("https://httpbin.org/headers")?;
// copy the response body directly to stdout
std::io::copy(&mut res, &mut std::io::stdout())?;
Ok(())
}