La façon la plus simple d'effectuer des requêtes HTTP en Rust est d'utiliser la fonction reqwest caisse :
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let resp = reqwest::blocking::get("https://httpbin.org/ip")?.text()?;
println!("{:#?}", resp);
Ok(())
}
En Cargo.toml
:
[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
Async
Reqwest soutient également la réalisation asynchrone Les requêtes HTTP utilisant Tokio :
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let resp = reqwest::get("https://httpbin.org/ip")
.await?
.text()
.await?;
println!("{:#?}", resp);
Ok(())
}
En Cargo.toml
:
[dependencies]
reqwest = "0.11"
tokio = { version = "1", features = ["full"] }
Hyper
Reqwest est une enveloppe facile à utiliser autour de Hyper qui est une bibliothèque HTTP populaire pour Rust. Vous pouvez l'utiliser directement si vous avez besoin de plus de contrôle sur la gestion des connexions. A Hyper L'exemple ci-dessous s'inspire largement de l'exemple de l'Union européenne. un exemple dans sa documentation :
use hyper::{body::HttpBody as _, Client, Uri};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = Client::new();
let res = client
.get(Uri::from_static("http://httpbin.org/ip"))
.await?;
println!("status: {}", res.status());
let buf = hyper::body::to_bytes(res).await?;
println!("body: {:?}", buf);
}
En Cargo.toml
:
[dependencies]
hyper = { version = "0.14", features = ["full"] }
tokio = { version = "1", features = ["full"] }
Réponse originale (Rust 0.6)
Je crois que ce que vous cherchez se trouve dans le bibliothèque standard . maintenant dans rust-http et la réponse de Chris Morgan est la méthode standard dans Rust actuel pour un avenir prévisible. Je ne sais pas jusqu'où je peux vous emmener (et j'espère que je ne vous emmène pas dans la mauvaise direction !), mais vous voudrez quelque chose comme :
// Rust 0.6 -- old code
extern mod std;
use std::net_ip;
use std::uv;
fn main() {
let iotask = uv::global_loop::get();
let result = net_ip::get_addr("www.duckduckgo.com", &iotask);
io::println(fmt!("%?", result));
}
Quant à l'encodage, il y a quelques exemples dans les tests unitaires dans src/libstd/net_url.rs.