【PHP】$_POSTが空になる



とあるAPIでwebhookを使用して通知を受け取り、DBを更新するプログラムを作成していたのですが、何度試してもPOSTデータが受け取れませんでした。プログラムは動いたのでwebhookは動いているようなのですが、$_POSTが空で帰ってくるという状態でした。

結構ハマったのでメモを残しておきます。




$_POSTは空

状況として、$_POSTで取ろうとすると空の配列が返ってきてました。

var_dump($_POST);  //出力:array(0)







file_get_contents(‘php://input’)だとうまくいく

解決した方法を申しますと、file_get_contents(‘php://input’)だとうまくいきました。

$body = file_get_contents('php://input');
var_dump($body);  //JSONデータが取れた







JSONは$_POSTでは受け取れない

なぜ$_POSTが空になっていたのか。

Content-Type:application/jsonは$_POSTで受け取れず、file_get_contents(‘php://input’)で受け取る必要があるようです。
ためしにリクエストのContent-Typeを見てみると、application/jsonとなってました。

echo $_SERVER['CONTENT_TYPE'];  //application/jsonだった








$_POSTで受け取れるのは2種類

$_POSTで受け取れるのは下記の2種類だけのようです。

Content-Type:application/x-www-form-urlencoded
Content-Type:multipart/form-data



フォーム送信でenctypeに何も指定しないと、application/x-www-form-urlencodedとして扱われるようです。
multipart/form-dataはファイル送信するときなどに指定しますね。






結論

$_POSTが空になる時はリクエストのContent-Typeを確認してみるといいのかなと思いました。リクエスト元のContent-Typeは$_SERVER[‘CONTENT_TYPE’]で確認できるので、ほんのひと手間です。


送信データは$_POSTや$_GETですべてとれると思っていたので、とても勉強になりました。



同じような現象で困っている方の参考になれば幸いです!




参考:

【PHP】JSONでPOSTされた値の取り出し方。file_get_contents(“php://input”) するようだ。
送信時のデータ形式を指定する

コメント

タイトルとURLをコピーしました