2011.01.11
PHPの処理中にPOSTリクエストを送り、そのレスポンスを受取る:memo
昔のPostを発掘中。
備忘録。
何かの理由があって、PHPの処理中にHTTP POSTリクエストなどを行い、そのレスポンスを受取る方法。
以下、キー値を送信し、それを元にしたデータを受取る事を想定しています。
1.リクエスト側
POSTリクエストを送る側。つまり、処理元の側です。
//1.1 送出データを組み立てます。
$data = array(
‘key’ => ‘value’ ,
);
//1.2 初期化
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://sample.com/get_data.php’);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD,”user:pass”);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//1.3 リクエスト実行
$outdata = curl_exec($ch);
curl_close($ch);
list($dust, $outdata ) = explode(“DataObj:”,$outdata);
//1.4 データを受けます。
$data_obj = new DataObj();
$data_obj = unserialize( trim( $outdata ) );
上から順に。
1.1
送出データを組み立てます。
上のように、配列に組み立てると楽だと思います。
WebのFormで行けば、keyはname,valueは送出データになります。
ファイルもいけるようです。
→PHP: curl_setopt – Manual (例2:ファイルのアップロードを参照)
1.2
初期化します。
つらつら、curl_setoptなる関数を呼び出してますが、リクエストによっては変更する必要があります。
詳しくは、PHP: curl_setopt – Manualを参考。
一応上で使っているものの簡単な説明です。
CURLOPT_URL:
リクエスト先のURLです。別にPHPでなくても問題ないです。
CURLOPT_POST:
POSTで送るという設定。
CURLOPT_USERPWD:
リクエスト先がBasci認証などが必要な場合、[user]:[pass]と指定することで、認証を通すことが出来ます。
CURLOPT_POSTFIELDS:
POSTで送るデータです。上の1.1で組み立てている物です。
CURLOPT_RETURNTRANSFER:
リクエスト先の出力を、文字列で受けるという設定です。
これを指定していないと、PHPの処理内で、レスポンスを受け取れません。
1.3
HTTP POSTのリクエストを出し、出力を$outdataに受けます。
頭にゴミが入っている事があるので、送出データは、セパレータで区切ったほうがよさそうです。
1.4
データを受けます。
上の例では、リクエストの出力はオブジェクトをシリアライズ化していることを想定しているので、unserializeしています。
PHPで、Classファイルなどがあるのであれば、シリアライズ化したデータを受ける方が面倒がなさそうですが、値をセパレータで区切るなどして出力してもらえれば、別にシリアライズ化されている必要はないと思います。
2.レスポンス側
POSTリクエストを受ける側。つまり、リクエスト先の側です。
$value= $_POST['key'];
$data_obj = DataObj::get( $value );
echo “DataObj:” . serialize($data_obj);
上で、echoされている値がリクエスト側のほうに送信されます。
CURLOPT_RETURNTRANSFERの指定が無い場合は、echoされた内容がそのまま出力されることになります。
上は、PHPでの例ですが、Parlなどでも同じように出力データを合わせれば問題ないと思います。
●参考
PHP: curl_setopt – Manual
PHPでの質問です。 GETリクエストを送り、その戻り値を取得したいのですがどの関数で行えばよいでしょうか。 送りたいリクエストは「GET / HTTP/ 」と言った値になります。.. – 人力検索はてな
PHP: オブジェクトのシリアル化 – セッションでのオブジェクト – Manual

Trackback URL
Trackback
Comment
Comment feed
Comment
ZenBack