php://input
JQuery からの Ajax リクエストとやり取りするときに、 の代わりにメソッドを使用するように指示されました$_POST
。理解できないのは、$_POST
またはのグローバル メソッドではなく、 this を使用する利点です$_GET
。
ベストアンサー1
その理由は、php://input
コンテンツ タイプに関係なく、リクエストの HTTP ヘッダーの後のすべての生データを返すためです。
PHPのスーパーグローバルは$_POST
、次のいずれかのデータをラップすることになっています。
application/x-www-form-urlencoded
(シンプルなフォーム投稿の標準コンテンツタイプ)またはmultipart/form-data
(主にファイルのアップロードに使用されます)
これは、これらのコンテンツタイプのみがユーザーエージェントによってサポートされている必要があるしたがって、サーバーと PHP は従来、他の種類のコンテンツを受信することを想定していません (受信できないという意味ではありません)。
したがって、古き良き HTML を単純に POST するとform
、リクエストは次のようになります。
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
しかし、Ajax を頻繁に使用する場合は、おそらく、型 (文字列、int、bool) や構造 (配列、オブジェクト) を使用したより複雑なデータの交換も含まれるため、ほとんどの場合、JSON が最適な選択です。ただし、JSON ペイロードを含むリクエストは次のようになります。
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
コンテンツは現在application/json
(または少なくとも上記のいずれでもない) であるため、PHP の$_POST
-wrapper はそれを (まだ) 処理する方法を知りません。
データは残っていますが、ラッパー経由ではアクセスできません。そのため、file_get_contents('php://input')
(multipart/form-data
エンコードされていない限り)。
これは、XML データやその他の非標準コンテンツ タイプにアクセスする方法でもあります。