2017-01-30 217 views
2

在新的鳳凰應用程序中,Plug.Head插件默認存在,我對它的重要性很感興趣。爲什麼將HEAD請求轉換爲GET請求很有用?

我知道「the HEAD method is identical to GET except that the server MUST NOT send a message body in the response」。

我覺得official Phoenix guides是一流的,但是這把我關在Routing guide

Plug.Head - 轉換HEAD請求GET請求,併除去 響應主體

如果HEAD請求沒有身體,那爲什麼需要這個?我想也許是爲了控制格式錯誤的請求,但看着Plug.Head implementation,它只是將HEAD方法切換到GET。

def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"} 
    def call(conn, []), do: conn 
end 

我能找到關於這一主題最接近的事是question on ServerFault但它是關係到NGINX並根據需要HEAD請求轉換爲GET和相應的GET請求回到HEAD一個有缺陷的應用程序邏輯。

回答

1

AFAICT,這個想法是,Plug.Head只是確保該請求被處理爲GET;實施HEAD的第二部分不是發送正文,由插頭連接適配器完成。大多數回調的文檔(如send_resp)指定「如果請求具有方法"HEAD",則適配器不應將響應發送給客戶端。」

+0

感謝您指出連接適配器!儘管引用的評論或者是不準確的,或者我仍然遠離大局,因爲我從「適配器不應該將響應**主體**發送給客戶端」錯過「** body **」一詞。響應獨立於請求方法發送,只有主體從對HEAD的響應中被省略。但是,我可能會誤解適配器是如何工作的。 –

+0

評論是正確的。服務器不應在**響應**中向HEAD **請求**發送主體。 HEAD **請求**本身是否具有主體是無關緊要的。 –

1

由於鳳凰在很大程度上是由Rails的啓發,你可以放心地賭Plug.HeadRack::Head.

HEAD請求返回如GET,但只有標題相同的反應啓發。所以爲了生成正確的標題,他們被路由到您的鳳凰應用中的GET操作。

但是爲了產生正確的(空的)正文,必須將正文的正文刪除。因爲Rack::Head是中間件,所以它在得到控制器的響應後就會這樣做。

相比之下,Plug的架構更像流水線,Plug.Head修改方法並傳遞conn,但從未再次看到它。

如果您看到cdegroot's answer,那麼該責任被傳遞給Plug.Conn.Adapter以實現(即網絡服務器)。

+0

所以簡單的答案是** HEAD - > GET轉換是爲了使路由匹配更容易?**我用'curl' HEAD和GET請求測試了一個簡單的Phoenix應用程序,響應正確,日誌顯示HEAD請求正確的(雖然'Plug.Logger'在'Plug.Head'之前這並不奇怪)。所以我猜想最初的請求方法保留在某個地方,但這對於另一個問題是重要的。 –

相關問題