CakePHPでマルチパートでないHTTP-Postリクエストを受信する方法を記載する。
動作環境・Ubuntu 12.04.3 LTS
・CakePHP 2.4.4
・Apache 2.2.22
Webで実装方法を検索してみたところ、ピュアPHPではすぐに見つかったのだが、CakePHPではなかなか見つけることができなかった。
Webで検索するキーワードが悪かったのかもしれない。
HTTPクライアントはAndroidでHttpURLConnectionを使用した。
サンプルコードはこちら。
androidからAsyncTaskLoaderでHTTP-Post通信をする
ピュアPHPの場合
ピュアPHPでPostリクエストのデータを取得する場合は、file_get_contentsメソッドを使用する。
引数に「php://input」を指定する。
リクエストデータは戻り値で取得できる。
<?php
// 受信データ格納
$data = file_get_contents("php://input");
// レスポンス
echo "POST DATA RECEIVED. data[".$data."]"
?>
CakePHPの場合
CakePHPでPOSTデータを取得する場合、
CakeRequest::data[‘key’]
などでデータを取得するが、マルチパートでないPOSTデータの場合、取得できない。
上記の「key」を「php://input」としても取得できない。
といっても、CakePHPのどこかで「php://input」からPOSTデータを取得している箇所があるはずなので、CakePHPのコードを「php://input」で検索してみる。
すると、CakeRequest::_readInputメソッドで「php://input」を使用していた。
_readInputメソッドはprotectedなので、さらに_readInputメソッドを使用している箇所を検索してみる。
_readInputメソッドを使用している箇所は2カ所あったが、CakeRequest::inputメソッドがpublicだったので、ここからPOSTデータを取得できそう。
というわけで、CakeRequest::inputメソッドを使用する。
inputメソッドは引数にデコード用コールバックを指定できるが、省略可能引数となっているため、今回は省略する。
リクエストデータは戻り値で取得できる。
下記のサンプルでは、取得したリクエストデータを、そのままレスポンスデータとして送信している。
<?php
class PostSamplesController extends AppController {
public function index() {
if($this->request->is('post')) { // Post通信
// 受信データ格納
$input_data = $this->request->input();
// レスポンス
$this->response->body($input_data);
return $this->response;
}
}
}
?>
0 件のコメント:
コメントを投稿