README.md

# Any HTTP

Elixir library which wraps the main HTTP libraries. It allows the final project to decide which
HTTP library they want to use and provide an unified interface.

[Documentation](https://hexdocs.pm/any_http)

## Installation

```elixir
def deps do
  [
    {:any_http, "~> 0.4"}
  ]
end
```

## Configuration

### [:httpc](https://www.erlang.org/doc/man/httpc.html)

`:httpc` is already part of your application because it's part of Erlang.

Change your configuration to declare Req as your adapter:
```elixir
config :any_http, client_adapter: AnyHttp.Adapters.Httpc

# You can provide default options to the adapter.
config :any_http, httpc_default_opts: []
```

### [Req](https://hexdocs.pm/req)

Add Req to your `mix.exs` file:
```elixir
def deps do
  [
    {:req, "~> 0.4"}
  ]
end
```

Change your configuration to declare Req as your adapter:
```elixir
config :any_http, client_adapter: AnyHttp.Adapters.Req

# You can provide default options to the adapter.
config :any_http, req_default_opts: []
```

### [:hackney](https://hexdocs.pm/hackney/)

Add Req to your `mix.exs` file:
```elixir
def deps do
  [
    {:hackney, "~> 1.20"}
  ]
end
```

Change your configuration to declare Req as your adapter:
```elixir
config :any_http, client_adapter: AnyHttp.Adapters.Hackney

# You can provide default options to the adapter.
config :any_http, hackney_default_opts: []
```

## Usage

Just call the `AnyHttp` module to interact with HTTP:

```elixir
AnyHttp.post(
  # Provide the URL as a string or an URI
  "https://my_server/api",
  # Provide the HTTP headers as map or list of tuple, put nil if none
  %{"content-type" => "application/json"},
  # Provide the body, put nil if none
  Jason.encode!(%{hello: "world"}),
  # Provide the adapter options, can be ommited
  receive_timeout: :timer.seconds(5)
)
```

The result will look like:

```elixir
{:ok,
  %AnyHttp.Response{
    status: 201,
    headers: %{"content-type" => ["application/json"]},
    body: "{\"bye\":\"world\"}"
  }
}
```