REST APIを作っていてパラメータの取得で悩んだのでメモ
リクエストメソッド別パラメータ取得コード
GET
これは特に問題ないですね。いつも通り。
$parameter = $_GET;
POST
これも問題なし。
$parameter = $_POST;
PUT
ここからが問題。
結論としてはphp://inputで取得するようです。
parse_str(file_get_contents('php://input'), $put_param);
DELETE
PUTと同じように取得できます。
parse_str(file_get_contents('php://input'), $delete_param);
まとめ
上記を踏まえてリクエストメソッド毎にパラメータを取得するコードを書いてみました。
function getParameter()
{
$parameter = array();
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
$parameter = $_GET;
break;
case 'POST':
$parameter = $_POST;
break;
case 'PUT':
case 'DELETE':
default:
parse_str(file_get_contents('php://input'), $parameter);
break;
}
return $parameter;
}
テスト用コマンド
以下コマンドでテストしてみてください。
$ curl http://localhost/test.php -X PUT -d "abc=def&efg=hij"
上記コード利用時の注意点
公式にて以下のコメントがあります。
PHP 5.6 より前のバージョンでは、 php://input でオープンしたストリームは、一度しか読み込めません。
つまり、1度読み込んでしまった場合、値を取得できないという事です。
フレームワークによってはRequestオブジェクトなどに格納するために、既に取得済みの場合があります。
この場合、上記コードではPUTのbodyは取得できませんので、フレームワーク備え付けのRequestオブジェクトなどから取得してください。
取得済みを確認したフレームワークは以下
- CakePHP2系 : 取得できませんでした。
$this->request->input()
等で取得 - phalcon : 取得できました。
$this->request->getPut()
でも取得できるみたいです。