Phoenix框架模式匹配请求标头

tom*_*ham 3 elixir phoenix-framework plug

我正在尝试为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
Run Code Online (Sandbox Code Playgroud)

这当前没有工作,并且call/2在没有指定接受标头时被设计为后备的第二个.如何匹配请求标头?

Dog*_*ert 12

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
Run Code Online (Sandbox Code Playgroud)