HTTP client behaviour for making HTTP requests.
@type body() :: String.t()
@type headers() :: [{String.t(), String.t()}]
@type method() :: :get | :post | :put | :patch | :delete
@type options() :: keyword()
@type response() :: {:ok, %{status_code: integer(), body: String.t(), headers: list()}} | {:error, %{reason: any()}}
@type url() :: String.t()
@callback request(method(), url(), body(), headers(), options()) :: response()