とある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”) するようだ。
送信時のデータ形式を指定する
コメント