HTTP GETリクエストにはcontent-typeヘッダーが必要ですか?


154

私が理解している限り、コンテンツタイプを設定する場所は2つあります。

  1. クライアントは、サーバーに送信する本文のコンテンツタイプを設定します(例:投稿用)
  2. サーバーは、応答のコンテンツタイプを設定します。

これは、すべてのgetリクエスト(クライアント側)にコンテンツタイプを設定する必要がない、または設定すべきでないことを意味しますか?そして、もし私ができる、またはすべきなのはどのようなコンテンツタイプでしょうか?

また、クライアントのコンテンツタイプが、クライアントが受信するコンテンツのタイプを指定しているという投稿もいくつか読んだ。それで私のポイント1は正しくないかもしれませんか?

回答:


112

RFC 7231セクション3.1.5.5によると:

ペイロード本体を含むメッセージを生成する送信者は、囲まれた表現の意図されたメディアタイプが送信者に知られていない限り、そのメッセージにContent-Typeヘッダーフィールドを生成する必要があります(SHOULD)場合 Content-Typeヘッダフィールドが存在しない場合、受信者は、いずれかの「アプリケーション/オクテットストリーム」(のメディアタイプ仮定してもよい[RFC2046]、セクション4.5.1)、またはそのタイプを決定するために、データを調べ。

つまり、Content-TypeHTTPヘッダーはPUTPOSTリクエストに対してのみ設定する必要があります。


5
@Epoc、引用されたメッセージはせいぜい暗黙的なものです。entity-bodyのないメッセージにContent-Typeが含まれているとは実際には言われていませんSHOULD NOT。明示的な見積もりはありますか?
Pacerier 2014

1
@Pacerierは、たとえ間違っていても、他の誰かの答えの核心的な結論を取り消さないでください。Epocの回答が間違っていることに同意します。彼が引用したセクションには、彼の回答の結論を裏付けるものは何もないので、反対票を投じる価値があります。しかし、だからといって答えを編集して、その中核となる前提をなくし、その意味を完全に変える必要があるという意味ではありません。
Mark Amery 2017年

8
@Epocの言葉を文字通り読みすぎていると思います。確かに、引用されたセクションはそれが意味することを彼が言うことを意味しない。しかし、私は結論はOPの質問の文脈では正しいと思います。OPは、Content-Typeを含めるのが適切な場合とそうでない場合の明確性を求めています。Epocは、ヘッダーの使用方法に関する情報を提供し、合理的な開発者はだれでも、ペイロードボディ(主にPUTとPOST)を含むリクエストにはコンテンツタイプを「使用する」べきであり、おそらく使用すべきではないという結論を導き出しました。 GETやHEADなど、役に立たない場所で
JVMATL 2018年

1
あなたの投稿文「それは……を意味します」・ストレッチです。
エイドリアンバーソロミュー

64

Getリクエストにはリクエストエンティティ(つまり、本文)がないため、コンテンツタイプは必要ありません。


31
@Dmitry、引用が必要です。それ以外の場合は、事実ではなく仮定として扱われます。
Pacerier 2014

6
仕様にGETでContent-Typeを含めることはできないと記載されていないことに同意しますが、.NetはHttpClientでそれを強制するようです。stackoverflow.com/questions/10679214/…を
Adam


27

受け入れられた答えは間違っています。引用は正しいですが、PUTとPOSTに必要であるという主張は正しくありません。PUTまたはPOSTが実際に追加のコンテンツを持っている必要はありません。GETが実際にコンテンツを持っていることの禁止もありません。

RFCはそれらが何を意味するかを正確に述べています.. IFFあなたの側(クライアントORオリジンサーバー)がHTTPヘッダーを超えて追加のコンテンツを送信する場合は、Content-Typeヘッダーを指定する必要があります。ただし、Content-Typeを省略しても、コンテンツを含めることができます(たとえば、Content-Lengthヘッダーを使用して)。


0

短い答え:ほとんどの場合、HTTP GETリクエストにcontent-typeヘッダーは必要ありません。しかし、仕様では、HTTP GETのコンテンツタイプヘッダーも除外されていないようです。

サポート資料:

  1. 「Content-Type」は、表現(つまり、ペイロード)メタデータの一部です。RFC 7231セクション3.1から引用 :

    3.1。表現メタデータ

    表現ヘッダーフィールドは、表現に関するメタデータを提供します。メッセージにペイロード本体が含まれている場合、表現ヘッダーフィールドは、ペイロード本体で囲まれた表現データの解釈方法を記述します。...

    次のヘッダーフィールドは、表現メタデータを伝達します。

    +-------------------+-----------------+
    | Header Field Name | Defined in...   |
    +-------------------+-----------------+
    | Content-Type      | Section 3.1.1.5 |
    | ...               | ...             |
    

    RFC 7231セクション3.1.1.5から引用(ちなみに、現在選択されている回答はセクション番号にタイプミスがありました):

    「Content-Type」ヘッダーフィールドは、関連付けられた表現のメディアタイプを示します

  2. その意味で、Content-Typeヘッダーは実際にはHTTP GETリクエスト(またはPOSTまたはPUTリクエスト)に関するものではありません。それはそのようなどんなリクエストの中のペイロードについてでもあります。したがって、ペイロードがない場合、は必要ありませんContent-Type。実際には、一部の実装は先に進み、その理解可能な仮定を行いました。アダムのコメントから引用:

    「仕様では、GETでContent-Typeを使用できないとは記載されていませんが、.NetはHttpClientでそれを強制しているようです。このSO q&aを参照してください。」

  3. ただし、厳密に言うと、仕様自体がHTTP GETにペイロードが含まれている可能性を排除するものではありません。RFC 7231セクション4.3.1から引用:

    4.3.1 GET

    ...

    GETリクエストメッセージ内のペイロードにはセマンティクスが定義されていません。GETリクエストでペイロードボディを送信すると、一部の既存の実装がリクエストを拒否する可能性があります。

    したがって、何らかの理由でHTTP GETにペイロードが含まれているContent-Type場合は、ヘッダーもおそらく妥当です。


-2

GETメッセージでcontent-typeを渡さないことの問題は、サーバー側がとにかくコンテンツを決定するため、content-typeが無関係であることを確認することです。私が遭遇した問題は、多くの場所で、Webサービスを十分にスマートに設定して、渡すコンテンツタイプを取得し、リクエストした「タイプ」で応答を返すようになっていることです。例えば。現在、デフォルトでJSONになっている場所でメッセージを送信していますが、webサービスが設定されているため、xmlのcontent-typeを渡すと、JSONのデフォルトではなくxmlが返されます。これは素晴らしいアイデアだと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.