# flawless-http
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