2017-02-19 51 views
0

我正在嘗試實現API版本控制的自定義插件。現在我需要能夠匹配通過請求標頭傳遞的值(即Accept: application/vnd.app.v1+json)。到目前爲止,我已經實現了以下內容:Phoenix框架模式匹配請求標頭

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。我如何與請求標題匹配?

+0

'req_headers'是一個列表;你不能像這樣模式匹配。不過你可以使用'get_req_header/2'。 – Dogbert

回答

6

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 
+0

這是完美的。謝謝!! – tomasbasham