PHP

リクエストメソッド毎のパラメータの取得

More than 3 years have passed since last update.

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()でも取得できるみたいです。

参考:

PHP公式 > php://

PUTメソッドのbodyを取得する