はじめに
こんにちは!高校生でプログラミング勉強中のCureSabaです。
今回は「PHPでPOSTリクエスト時のクエリパラメータの受け取り方」について、自分の気づきをまとめます。
背景
APIを設計しているとき、POST
リクエストで
https://example.com/endpoint?foo=bar
のように、クエリパラメータ付きのURLを使うケースがあります。
「POSTなんだから、パラメータは全部$_POST
で受け取れるよね?」
と思っていましたが、クエリパラメータ(?以降)は$_POST
には入りません。
結論
- クエリパラメータは、HTTPメソッドに関わらず
$_GET
に格納される - POSTリクエストの本文(form-dataやjson)は
$_POST
やphp://input
で受け取る
実際に試してみる
<?php
// 例: https://example.com/endpoint?foo=bar にPOSTリクエスト
var_dump($_GET); // クエリパラメータ(foo=bar)が入る
var_dump($_POST); // POST本文(フォームデータなど)が入る
?>
例えばcurlで…
curl -X POST "https://example.com/endpoint?foo=bar" -d "baz=qux"
-
$_GET
→['foo' => 'bar']
-
$_POST
→['baz' => 'qux']
まとめ
- POSTリクエストでもURLの?以降の値は
$_GET
で受け取る - 「POSTだから全部
$_POST
」と思い込んでいるとハマるので注意
おまけ:JSONの場合
Content-Typeがapplication/json
の場合は、
$_POST
には何も入らず、php://input
から取得します。
$json = file_get_contents('php://input');
$data = json_decode($json, true);
終わりに
もし、この記事が役に立ったと思ったら、ぜひコメントやシェアをお願いします。また、質問や改善点などがあれば気軽にコメントしてください!
それでは、良いプログラミングライフを!