# flawless-http docs.rs docs crates.io version HTTP client for https://flawless.dev. > This library takes a lot of inspiration from [`ureq`]. ### Quick start A simple GET request would look like this. ```rust,no_run use flawless::workflow; use flawless_http::get; #[workflow("fetch")] fn fetch() { let request = get("https://example.com").set_header("Accept", "application/json"); let response = request.send().unwrap(); log::info!("{}", String::from_utf8(response.body()).unwrap()); } ``` ### Body A request can contain a body, but depending on the body type, additional request headers might be set. If headers are already manually set by the user, they are not overwritten. ##### Text arguments In case a `String` or `&str` type is given to `body`, the `"Content-Length"` header is going to be set to the byte length of the string. ```rust,no_run use flawless_http::post; let response = post("https://httpbin.org/post") .body("Hello world!") .send(); assert!(response.is_ok()); ``` ##### Form arguments In case a slice of tuples of strings is passed in (`&[(&str, &str)]`), `body` will assume a for is being submitted and URL encode it. It will set the header `"Content-Type"` to `"application/x-www-form-urlencoded"`, and `"Content-Length"` to the size of the encoded content. ```rust,no_run use flawless_http::post; let response = post("https://httpbin.org/post") .body([ ("Hello", "world!"), ("second", "argument"), ].as_ref()) .send(); assert!(response.is_ok()); ``` ##### JSON arguments In case of a [`serde_json::Value`] type, `body` will assume that the content is of type JSON and set the header `"Content-Type"` to `"application/json"`. It will also set `"Content-Length"` to the size of the serialized JSON. ```rust,no_run use flawless_http::post; use serde_json::json; let response = post("https://httpbin.org/post") .body(json!({ "Hello": "world!", "second": "argument", })) .send(); assert!(response.is_ok()); ``` [`ureq`]: https://github.com/algesten/ureq