Phoenix 框架模式匹配请求 headers
Phoenix framework pattern match request headers
我正在尝试为 API 版本控制实现自定义插件。现在我需要能够匹配通过请求 headers(即 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
,它被设计为当未指定接受 header 时的后备。如何匹配请求 headers?
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
我正在尝试为 API 版本控制实现自定义插件。现在我需要能够匹配通过请求 headers(即 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
,它被设计为当未指定接受 header 时的后备。如何匹配请求 headers?
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