Заголовки запроса соответствия шаблона феникс

Я пытаюсь реализовать пользовательский плагин для управления версиями API. Теперь мне нужно иметь возможность сопоставить значение, переданное с заголовками запросов (т.е. Accept: application/vnd.app.v1+json). До сих пор я реализовал следующее:

defmodule UsersApi.Plugs.APIVersion do
  import Plug.Conn

  @versions ["application/vnd.app.v1+json", "application/vnd.app.v2+json"]

  def init(version), do: version

  def call(%{req_headers: %{"accept" => version}} = conn, _) when version in @versions do
    assign(conn, :version, version)
  end

  def call(conn, version), do: assign(conn, :version, version)
end

Это в настоящее время не работает и проваливается на второй call/2 который разработан как запасной вариант, когда не указан заголовок accept. Как я могу сопоставить заголовки запроса?

1 ответ

Решение

req_headers список, но вы сопоставляете его с шаблоном, как карта, которая всегда терпит неудачу, и все вызовы call/2 в конечном итоге в запасной. Ты можешь использовать get_req_header/2 за это:

def call(conn, default_version) do
  version = case get_req_header(conn, "accept") do
    [version] when version in @versions -> version
    _ -> default_version
  end
  assign(conn, :version, version)
end
Другие вопросы по тегам