ApiBrasil.Core.Transport behaviour (APIBrasil v0.0.1)

Copy Markdown View Source

Camada de transporte HTTP plugável.

A implementação padrão é ApiBrasil.Core.Transport.Httpc (:httpc, do Erlang/OTP — sem dependências). Injete a sua para usar proxies corporativos, instrumentação, Finch/Req/Tesla ou mocks de teste.

Um transporte pode ser:

  • um módulo que implementa este behaviour;
  • uma tupla {módulo, opções}, com as opções repassadas em cada chamada;
  • uma função de aridade 1, que recebe a t:request/0 e devolve {:ok, resposta} ou {:error, erro} — o atalho para testes.

Contrato

Devolve {:ok, %Response{}} para qualquer status HTTP; devolve {:error, %ApiBrasil.Core.Error{}} (:network ou :timeout) apenas quando não houve resposta.

defmodule MeuTransporte do
  @behaviour ApiBrasil.Core.Transport

  alias ApiBrasil.Core.Transport.Response

  @impl true
  def request(%ApiBrasil.Core.Transport.Request{} = request, _opts) do
    {:ok, Response.json(200, %{"ok" => true, "url" => request.url})}
  end
end

ApiBrasil.new(transport: MeuTransporte)

Summary

Types

Verbo HTTP usado pelo gateway.

t()

Transporte aceito pela configuração.

Callbacks

Executa a requisição HTTP.

Functions

Despacha a requisição para o transporte configurado — módulo, {módulo, opções} ou função de aridade 1.

Decodifica o corpo cru conforme o tipo de resposta: JSON vira mapa/lista, corpos não-JSON viram texto e :binary devolve os próprios bytes.

Devolve o verbo em maiúsculas — GET, POST, PUT, PATCH ou DELETE.

Verbos HTTP suportados.

Types

method()

@type method() :: :get | :post | :put | :patch | :delete

Verbo HTTP usado pelo gateway.

t()

Transporte aceito pela configuração.

Callbacks

request(t, keyword)

Executa a requisição HTTP.

Functions

call(transport, request)

Despacha a requisição para o transporte configurado — módulo, {módulo, opções} ou função de aridade 1.

decode_body(raw, atom)

@spec decode_body(binary(), :json | :binary) :: term()

Decodifica o corpo cru conforme o tipo de resposta: JSON vira mapa/lista, corpos não-JSON viram texto e :binary devolve os próprios bytes.

method_to_string(method)

@spec method_to_string(method()) :: String.t()

Devolve o verbo em maiúsculas — GET, POST, PUT, PATCH ou DELETE.

methods()

@spec methods() :: [method()]

Verbos HTTP suportados.