2017-01-30 15 views
2

新しいPhoenixアプリケーションでは、デフォルトで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リクエストを変換した場合 レスポンスボディ

を取り除き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ですが、それはHEADリクエストが戻っHEADにGETして、それぞれのGET応答に変換する必要がnginxのと欠陥のあるアプリケーションロジックに関連していました。

答えて

1

AFAICTの場合、Plug.Headは、要求がGETとして処理されることを保証します。本体を送信していないHEADを実装する第2の部分は、プラグ接続アダプタによって行われます。 send_respのようなほとんどのコールバックのドキュメントでは、「要求にメソッド"HEAD"がある場合、アダプタはクライアントに応答を送信してはなりません。

+0

接続アダプターを指してくれてありがとう!引用されたコメントは間違っているか、私は「アダプターが応答**ボディー**をクライアントに送信すべきではない」から「**ボディー**」という言葉が欠けているので、大きな画像からはまだ遠いです。レスポンスはリクエストメソッドとは無関係に送信され、HEADへのレスポンスからボディのみが省略されます。しかし、やはり私はおそらくアダプターの仕組みを誤解しているかもしれません。 –

+0

コメントは正しいです。サーバは、HEAD **リクエスト**に応答**で本文を送信すべきではありません。 HEAD **リクエスト**には本体があるかどうかは関係ありません。 –

1

フェニックスは、主にRailsのに触発されているので、あなたは安全にPlug.HeadがHEADリクエストがGETとしてではなく、ヘッダーだけで同じ応答を返すRack::Head.

に触発されて賭けることができます。したがって、正しいヘッダーを生成するために、PhoenixアプリケーションのGETアクションにルーティングされます。

ただし、正しい(空の)ボディを生成するには、レスポンスのボディを削除する必要があります。 Rack::Headはミドルウェアであるため、コントローラからの応答を取得した後に実行されます。

対照的に、プラグのアーキテクチャはパイプラインのように機能し、Plug.Headはメソッドを変更し、connを渡しますが、もう一度それを見ることはありません。

cdegroot's answerが表示された場合、その責任はPlug.Conn.Adapter(ウェブサーバー)に渡されます。

+0

簡単な答えは、** HEAD - > GET変換はルートマッチングを簡単にすることです**私は 'curl' HEADとGETリクエストを持つ単純なPhoenixアプリケーションをテストしました。 (これは 'Plug.Logger'が' Plug.Head'に先行するので意外ではありませんが)。だから、私は最初のリクエストメソッドはどこかに保持されていると思うが、これは別の質問のための重要なものになるだろう。 –

関連する問題