2014年2月9日日曜日

CakePHPでマルチパートでないPost通信を受信する

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 件のコメント:

コメントを投稿