230 lines
6.2 KiB
Rust
230 lines
6.2 KiB
Rust
#![deny(warnings)]
|
|
#![deny(missing_docs)]
|
|
#![doc(html_root_url = "https://docs.rs/reqwest/0.6.2")]
|
|
|
|
//! # reqwest
|
|
//!
|
|
//! The `reqwest` crate provides a convenient, higher-level HTTP Client.
|
|
//!
|
|
//! It handles many of the things that most people just expect an HTTP client
|
|
//! to do for them.
|
|
//!
|
|
//! - Uses system-native TLS
|
|
//! - Plain bodies, JSON, urlencoded, (TODO: multipart)
|
|
//! - Customizable redirect policy
|
|
//! - (TODO: Cookies)
|
|
//!
|
|
//! The `reqwest::Client` is synchronous, making it a great fit for
|
|
//! applications that only require a few HTTP requests, and wish to handle
|
|
//! them synchronously. When [hyper][] releases with asynchronous support,
|
|
//! `reqwest` will be updated to use it internally, but still provide a
|
|
//! synchronous Client, for convenience. A `reqwest::async::Client` will also
|
|
//! be added.
|
|
//!
|
|
//! ## Making a GET request
|
|
//!
|
|
//! For a single request, you can use the [`get`][get] shortcut method.
|
|
//!
|
|
//! ```no_run
|
|
//! use std::io::Read;
|
|
//! let mut resp = reqwest::get("https://www.rust-lang.org").unwrap();
|
|
//! assert!(resp.status().is_success());
|
|
//!
|
|
//! let mut content = String::new();
|
|
//! resp.read_to_string(&mut content);
|
|
//! ```
|
|
//!
|
|
//! As you can see, reqwest's [`Response`][response] struct implements Rust's
|
|
//! `Read` trait, so many useful standard library and third party crates will
|
|
//! have convenience methods that take a `Response` anywhere `T: Read` is
|
|
//! acceptable.
|
|
//!
|
|
//! If you plan to perform multiple requests, it is best to create a [`Client`][client]
|
|
//! and reuse it, taking advantage of keep-alive connection pooling.
|
|
//!
|
|
//! ## Making POST requests (or setting request bodies)
|
|
//!
|
|
//! There are several ways you can set the body of a request. The basic one is
|
|
//! by using the `body()` method of a [`RequestBuilder`][builder]. This lets you set the
|
|
//! exact raw bytes of what the body should be. It accepts various types,
|
|
//! including `String`, `Vec<u8>`, and `File`. If you wish to pass a custom
|
|
//! Reader, you can use the `reqwest::Body::new()` constructor.
|
|
//!
|
|
//! ```rust
|
|
//! # use reqwest::Error;
|
|
//! #
|
|
//! # fn run() -> Result<(), Error> {
|
|
//! let client = reqwest::Client::new()?;
|
|
//! let res = client.post("http://httpbin.org/post")?
|
|
//! .body("the exact body that is sent")
|
|
//! .send()?;
|
|
//! # Ok(())
|
|
//! # }
|
|
//! ```
|
|
//!
|
|
//! ### Forms
|
|
//!
|
|
//! It's very common to want to send form data in a request body. This can be
|
|
//! done with any type that can be serialized into form data.
|
|
//!
|
|
//! This can be an array of tuples, or a `HashMap`, or a custom type that
|
|
//! implements [`Serialize`][serde].
|
|
//!
|
|
//! ```rust
|
|
//! # use reqwest::Error;
|
|
//! #
|
|
//! # fn run() -> Result<(), Error> {
|
|
//! // This will POST a body of `foo=bar&baz=quux`
|
|
//! let params = [("foo", "bar"), ("baz", "quux")];
|
|
//! let client = reqwest::Client::new()?;
|
|
//! let res = client.post("http://httpbin.org/post")?
|
|
//! .form(¶ms)?
|
|
//! .send()?;
|
|
//! # Ok(())
|
|
//! # }
|
|
//! ```
|
|
//!
|
|
//! ### JSON
|
|
//!
|
|
//! There is also a `json` method helper on the [`RequestBuilder`][builder] that works in
|
|
//! a similar fashion the `form` method. It can take any value that can be
|
|
//! serialized into JSON.
|
|
//!
|
|
//! ```rust
|
|
//! # use reqwest::Error;
|
|
//! # use std::collections::HashMap;
|
|
//! #
|
|
//! # fn run() -> Result<(), Error> {
|
|
//! // This will POST a body of `{"lang":"rust","body":"json"}`
|
|
//! let mut map = HashMap::new();
|
|
//! map.insert("lang", "rust");
|
|
//! map.insert("body", "json");
|
|
//!
|
|
//! let client = reqwest::Client::new()?;
|
|
//! let res = client.post("http://httpbin.org/post")?
|
|
//! .json(&map)?
|
|
//! .send()?;
|
|
//! # Ok(())
|
|
//! # }
|
|
//! ```
|
|
//!
|
|
//! [hyper]: http://hyper.rs
|
|
//! [client]: ./struct.Client.html
|
|
//! [response]: ./struct.Response.html
|
|
//! [get]: ./fn.get.html
|
|
//! [builder]: ./client/struct.RequestBuilder.html
|
|
//! [serde]: http://serde.rs
|
|
extern crate hyper;
|
|
|
|
#[macro_use]
|
|
extern crate log;
|
|
extern crate libflate;
|
|
extern crate hyper_native_tls;
|
|
extern crate serde;
|
|
extern crate serde_json;
|
|
extern crate serde_urlencoded;
|
|
extern crate url;
|
|
|
|
// should be in error.rs module, but due to scopes of macros,
|
|
// other modules won't see it there.
|
|
macro_rules! try_ {
|
|
($e:expr) => (
|
|
match $e {
|
|
Ok(v) => v,
|
|
Err(err) => {
|
|
return Err(::Error::from(::error::InternalFrom(err, None)));
|
|
}
|
|
}
|
|
);
|
|
($e:expr, $url:expr) => (
|
|
match $e {
|
|
Ok(v) => v,
|
|
Err(err) => {
|
|
return Err(::Error::from(::error::InternalFrom(err, Some($url.clone()))));
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
pub use hyper::client::IntoUrl;
|
|
pub use hyper::Error as HyperError;
|
|
pub use hyper::header;
|
|
pub use hyper::mime;
|
|
pub use hyper::method::Method;
|
|
pub use hyper::status::StatusCode;
|
|
pub use hyper::version::HttpVersion;
|
|
pub use hyper::Url;
|
|
pub use url::ParseError as UrlError;
|
|
|
|
pub use self::client::{Certificate, Client, ClientBuilder};
|
|
pub use self::error::{Error, Result};
|
|
pub use self::body::Body;
|
|
pub use self::redirect::RedirectPolicy;
|
|
pub use self::request::{Request, RequestBuilder};
|
|
pub use self::response::Response;
|
|
|
|
mod error;
|
|
mod body;
|
|
mod client;
|
|
mod redirect;
|
|
mod request;
|
|
mod response;
|
|
|
|
|
|
/// Shortcut method to quickly make a `GET` request.
|
|
///
|
|
/// See also the methods on the [`reqwest::Response`](./struct.Response.html)
|
|
/// type.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```rust
|
|
/// # extern crate reqwest;
|
|
/// # #[macro_use] extern crate error_chain;
|
|
/// #
|
|
/// use std::io::Read;
|
|
///
|
|
/// # error_chain! {
|
|
/// # foreign_links {
|
|
/// # Reqwest(reqwest::Error);
|
|
/// # Io(std::io::Error);
|
|
/// # }
|
|
/// # }
|
|
/// #
|
|
/// # fn run() -> Result<()> {
|
|
/// let mut result = String::new();
|
|
/// reqwest::get("https://www.rust-lang.org")?
|
|
/// .read_to_string(&mut result)?;
|
|
/// # Ok(())
|
|
/// # }
|
|
/// #
|
|
/// # fn main() {
|
|
/// # if let Err(error) = run() {
|
|
/// # println!("Error: {:?}", error);
|
|
/// # }
|
|
/// # }
|
|
/// ```
|
|
pub fn get<T: IntoUrl>(url: T) -> ::Result<Response> {
|
|
Client::new()?
|
|
.get(url)?
|
|
.send()
|
|
}
|
|
|
|
fn _assert_impls() {
|
|
fn assert_send<T: Send>() {}
|
|
fn assert_sync<T: Sync>() {}
|
|
fn assert_clone<T: Clone>() {}
|
|
|
|
assert_send::<Client>();
|
|
assert_sync::<Client>();
|
|
assert_clone::<Client>();
|
|
|
|
assert_send::<Request>();
|
|
assert_send::<RequestBuilder>();
|
|
|
|
assert_send::<Response>();
|
|
|
|
assert_send::<Error>();
|
|
assert_sync::<Error>();
|
|
}
|