我正在尝试为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当未指定accept标头时,这当前不起作用,并会掉到第二个call/2,它被设计为后备。如何匹配请求头?
发布于 2017-02-21 17:22:20
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)
endhttps://stackoverflow.com/questions/42331612
复制相似问题