web-dev-qa-db-fra.com

Comment faire une demande GET à Rust?

J'ai remarqué que Rust n'a pas de bibliothèque intégrée pour gérer HTTP, il n'a qu'un module net qui traite des protocoles IP bruts et TCP.

Je dois prendre un &str De l'URL, faire une requête HTTP GET, et en cas de succès, renvoyer un String ou &str Qui correspond au HTML ou JSON ou à une autre réponse sous forme de chaîne.

Cela ressemblerait à quelque chose comme:

use somelib::http;

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

Jetez un oeil à Hyper .

L'envoi d'une demande GET est aussi simple que cela.

let client = Client::new();

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

Vous pouvez trouver plus d'exemples dans la documentation .

Edit : Il semble que Hyper soit devenu un peu plus compliqué depuis qu'ils ont commencé à utiliser Tokio . Voici la version mise à jour.

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();
}

Et voici les dépendances requises.

[dependencies]
futures = "0.1"
hyper = "0.11"
tokio-core = "0.1"
10
Januson

La meilleure pratique actuelle pour ce problème particulier consiste à utiliser la caisse reqwest , comme spécifié dans le livre de recettes Rust . Ce code est légèrement adapté du livre de recettes pour fonctionner de manière autonome:

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(())
}

Comme le livre de cuisine le mentionne, ce code sera exécuté de manière synchrone.

Voir également:

7
nindalf

Essayez d'aller pour 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(())
}
1
Luis San Martin