httprust

How do I make an HTTP request from Rust?


How can I make an HTTP request from Rust? I can't seem to find anything in the core library.

I don't need to parse the output, just make a request and check the HTTP response code.

Bonus marks if someone can show me how to URL encode the query parameters on my URL!


Solution

  • Update: This answer refers to fairly ancient history. For the current best practices, please look at Isaac Aggrey's answer instead.


    I've been working on rust-http, which has become the de facto HTTP library for Rust (Servo uses it); it's far from complete and very poorly documented at present. Here's an example of making a request and doing something with the status code:

    extern mod http;
    use http::client::RequestWriter;
    use http::method::Get;
    use http::status;
    use std::os;
    
    fn main() {
        let request = RequestWriter::new(Get, FromStr::from_str(os::args()[1]).unwrap());
        let response = match request.read_response() {
            Ok(response) => response,
            Err(_request) => unreachable!(), // Uncaught condition will have failed first
        };
        if response.status == status::Ok {
            println!("Oh goodie, I got me a 200 OK response!");
        } else {
            println!("That URL ain't returning 200 OK, it returned {} instead", response.status);
        }
    }
    

    Run this code with a URL as the sole command-line argument and it'll check the status code! (HTTP only; no HTTPS.)

    Compare with src/examples/client/client.rs for an example that does a little more.

    rust-http is tracking the master branch of rust. At present it'll work in the just-released Rust 0.8, but there are likely to be breaking changes soon. Actually, no version of rust-http works on Rust 0.8—there was a breaking change which can't be worked around in privacy rules just before the release, leaving something that rust-http depends on in extra::url inaccessible. This has since been fixed, but it leaves rust-http incompatible with Rust 0.8.


    As for the query string encoding matter, at present that should be done with extra::url::Query (a typedef for ~[(~str, ~str)]). Appropriate functions for conversions: