簡潔な答え
HTTP メッセージ エンティティ本体を最もよく表すコンテンツ タイプを指定する必要があります。
長い答え
たとえば、PHP は自動的にコンテンツを $_POST に解析します。これは、サーバーが x-www-form-urlencoded を予期していることを示しているようです。
サーバーは「期待」していませんx-www-form-urlencoded
。PHP は、開発者の作業を簡素化するために、フォームでエンコードされたエンティティ本体をスーパーグローバルに解析し、かつエンティティ本体が実際に urlencoded キーと値の文字列である$_POST
場合にのみ実行します。配列を生成するためContent-Type: x-www-form-urlencoded
に到着するメッセージについても同様のプロセスに従います。これらのスーパーグローバルは役に立ちますが、残念ながら名前が付けられており、実際の HTTP トランザクションに関して実際に何が起こっているのかわかりにくくなっています。Content-Type: multipart/form-data
$_FILES
HTTP のすべてのサーバー実装に確実に準拠するには、RESTful API の POST および PUT 要求でどの MIME タイプを使用する必要がありますか?
HTTP メッセージ エンティティ本体を最もよく表すコンテンツ タイプを指定する必要があります。常に公式の HTTP 仕様に準拠してください。そうすれば間違いはありません。RFC 2616 Sec 7.2.1から(強調を追加):
エンティティ本体を含む HTTP/1.1 メッセージには、その本体のメディア タイプを定義する Content-Type ヘッダー フィールドを含める必要があります。メディア タイプが Content-Type フィールドで指定されていない場合に限り、受信者は、リソースの識別に使用される URI のコンテンツおよび/または拡張子の検査によって、メディア タイプを推測しようとする場合があります。メディア タイプが不明のままである場合、受信者はそれを「アプリケーション/オクテット ストリーム」タイプとして扱う必要があります (SHOULD)。
主流のサーバー技術はすべて、これらのルールに従います。思慮深い Web アプリケーションは、Content-Type
ヘッダーが正しい場合とそうでない場合があるため、ヘッダーを信頼しません。メッセージの発信者は、完全に偽の値を自由に送信できます。通常、Content-Type
ヘッダーは事前検証手段としてチェックされますが、コンテンツは実際のデータを解析することによってさらに検証されます。たとえば、JSON データを REST サービスに PUT している場合、エンドポイントは最初に を送信したことを確認しますContent-Type: application/json
が、実際にはメッセージのエンティティ ボディを解析して、それが実際に有効な JSON であることを確認します。