ExAws.Request.HttpClient behaviour (ExAws v2.5.9)
View SourceSpecifies expected behaviour of an HTTP client.
ExAws allows you to use your HTTP client of choice, provided that it can be coerced into complying with this module's specification.
The default is :hackney.
Example: Req
Here is an example using Req.
First, create a module implementing the ExAws.Request.HttpClient behaviour.
defmodule ExAws.Request.Req do
@moduledoc """
ExAws HTTP client implementation for Req.
"""
@behaviour ExAws.Request.HttpClient
@impl ExAws.Request.HttpClient
def request(method, url, body, headers, _http_opts) do
request = Req.new(decode_body: false, retry: false)
case Req.request(request, method: method, url: url, body: body, headers: headers) do
{:ok, response} ->
response = %{
status_code: response.status,
headers: Req.get_headers_list(response),
body: response.body,
}
{:ok, response}
{:error, reason} ->
{:error, %{reason: reason}}
end
end
endThen, in build-time config (e.g. config.exs):
config :ex_aws,
http_client: ExAws.Request.ReqWhen conforming your selected HTTP Client take note of a few things:
The module name doesn't need to follow the same styling as this module it is simply your own 'HTTP Client', i.e.
MyApp.HttpClientThe request function must accept the methods as described in the
request/5callback, you can however set these as optional, i.e.http_opts \\ []Ensure the call to your chosen HTTP Client is correct and the return is in the same format as defined in the
request/5callback
Example: Mojito
def request(method, url, body, headers, http_opts \\ []) do
Mojito.request(method, url, headers, body, http_opts)
end
Summary
Types
Callbacks
@callback request( method :: http_method(), url :: binary(), req_body :: binary(), headers :: [{binary(), binary()}, ...], http_opts :: term() ) :: {:ok, %{status_code: pos_integer(), headers: any()}} | {:ok, %{status_code: pos_integer(), headers: any(), body: binary()}} | {:error, %{reason: any()}}