5

我正在尝试为 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,当没有指定接受标头时,它被设计为后备。如何匹配请求标头?

4

1 回答 1

16

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
于 2017-02-21T09:22:20.493 回答