web-dev-qa-db-ja.com

GETリクエストに設定する正しいContent-Lengthは何ですか?

次のコードを使用してPOSTリクエストを行うと:

string body = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(body);
WebRequest request = WebRequest.Create("http://internalurl");
request.Method = "POST";
request.ContentLength = bytes.Length;

コンテンツの長さをPOSTedのバイト数に設定しました。 ContentLengthリクエストの正しいGETは何ですか?

15
merlin2011

通常、GETリクエストを実行するときに追加のデータを送信しないため、ヘッダーContent-Lengthはまったく送信しないでください。

ヘッダーContent-Lengthは、message-bodyを送信する場合にのみ含める必要があり、問題のヘッダーの値は常にこのフィールドの長さであり、測定されます(OCTETs)バイト単位。

(RFC2616)14.13 Content-Length

Content-Lengthエンティティヘッダーフィールドは、受信者に送信されるエンティティ本体のサイズをOCTETの10進数で示します。HEADメソッドの場合は、リクエストがGETだった場合に送信されたはずのentity-body。

<snip />

セクション 4.4 のルールで禁止されていない限り、アプリケーションはこのフィールドを使用してメッセージ本文の転送長を示す必要があります。


GETリクエストを実行するときにmessage-bodyを含めることは(AFAIK)悪い習慣と見なされますが、HTTPを読み取るときに RFC2616GETリクエストにmessage-bodyを含めることができないことを示すものは何もありません。

今日のほとんどのWebサーバーは、message-bodyでデータを送信し、それを期待している場合、応答したいもので応答しないと思いますがその場合、解析および処理されます。

(RFC2616)4.3メッセージ本文

HTTPメッセージのメッセージボディ(存在する場合)は、要求または応答に関連付けられたエンティティボディを運ぶために使用されます。 Message-bodyは、Transfer-Encodingヘッダーフィールド(セクション14.41)で示されているように、transfer-codingが適用されている場合にのみentity-bodyと異なります。

   message-body = entity-body
                | <entity-body encoded as per Transfer-Encoding>

Transfer-Encodingは、メッセージの安全で適切な転送を保証するために、アプリケーションによって適用される転送コーディングを示すために使用する必要があります。 Transfer-Encodingは、エンティティではなくメッセージのプロパティであるため、要求/応答チェーンに沿った任意のアプリケーションによって追加または削除される場合があります。 (ただし、セクション3.6では、特定の転送コーディングを使用できる場合に制限があります。)

メッセージ本体がメッセージで許可される場合のルールは、要求と応答で異なります。

リクエストにメッセージ本文が存在することは、リクエストのメッセージヘッダーにContent-LengthまたはTransfer-Encodingヘッダーフィールドが含まれていることによって通知されます。

リクエストメソッドの仕様(セクション5.1.1)でエンティティボディをリクエストに送信することが許可されていない場合は、メッセージボディをリクエストに含めてはなりません(MUSTNOT)。

サーバーは、要求に応じてメッセージ本文を読み取って転送する必要があります。リクエストメソッドにエンティティボディの定義済みセマンティクスが含まれていない場合、リクエストを処理するときにメッセージボディを無視する必要があります。

26