axiosからPOSTしたデータをphpの$_POSTで取得できないとき
概要
フロント側から下記のようにPOSTしたデータをhogehoe.comサーバのapi.phpで受け取るために$_POST['param']を参照しても データが受け取れなかったりすることがあるのでその原因と対応についてのメモ
axios.post('http://hogehoge.com/api.php', {'param':'value'})
原因
通常axiosでPOSTしたデータはContent-Type:application/jsonのjson形式で送られる。 PHPのマニュアルによるとcontent-typeがapplication/x-www-form-urlencodedかあるいは multipart/form-dataの場合に$_POSTにデータが入るとのことである。 よって、Content-Type:application/x-www-form-urlencodedでPOSTすれば良い。
対応
URLSearchParamsクラスが用意されているので、これを利用して下記のように送信する。 こうすると、Content-Type:application/x-www-form-urlencodedでPOSTされる。
const params = new URLSearchParams()
params.append('param', 'value')
axios.post('http://hogehoge.com/api.php', params)
その他
なんらかの事情で、axiosのPOST処理を変更することが難しい場合は、PHP側で対応する。 Content-Type:application/jsonでPOSTされたデータは、HTTPボディに入るので 下記のように、php://inputから読込み取得する。
$params = json_decode(file_get_contents('php://input'), true);
$value = $params['value'];
追伸
実はXREA(エクスリア)というレンタルサーバーでは、 Content-Type:application/jsonでPOSTされたデータを$_POSTで取得できていた。
その後lolipopレンタルサーバーで同じプログラムを動かそうと思うと$_POSTでは取得できなかった。
PHPのバージョンや、設定によって挙動が変わってくるのかもしれないが、 いずれにしても、$_POSTで取得したいなら、 Content-Type:application/x-www-form-urlencodedでPOSTするようにすると変なところでハマらなくて済む。