2008年07月24日

PHPからPOSTリクエストを送る

備忘録として。PHPは、4.3.9です。


1.PHPの Client URL Library(cURL)を使う。

cURLが何に使う関数なのか定かでなかったのですが、こいつを使えば、POSTリクエストが送れます。
参考URL:JUGEMの自作テンプレートを配布 Show-U PHP HTTPリクエストを送る CURLパッケージ

すっきりとしたソースコードで実現が出来ます。結果を変数で受け取る(CURLOPT_RETURNTRANSFER が True)と、その結果を表示すれば、POSTしたURLの実行結果が表示されます。これを表示しなければ、HTTPヘッダーには何も出力されていないので、そこから別ページにリダイレクトも可能です。また、結果を変数で受け取らなければ、リクエストした時点で、POST先のURLの出力結果が表示されます。

これを使って作った簡単な(笑)関数

function http_post($url,$postdata="",$redirect="")
{
//POSTに設定するパラメータ
if ($postdata == "")
$param = "";
else {
$param = "";
while (list($name,$value) = each($postdata)) {
if ($param != "") $param .= "&";
$param .= $name."=".$value;
}
}

//curlでPOST
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,false);
curl_setopt($ch,CURLOPT_POST,true);
if ($param != "")
curl_setopt($ch,CURLOPT_POSTFIELDS,$param);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$res = curl_exec($ch);
curl_close($ch);

//リダイレクトがある場合はそのページへ
if ($redirect != "") {
header("Location: ".$redirect);
exit;
}
//リダイレクトがない場合は結果を表示
else
print $res;
}

POSTで送るクエリーは、$postdata["key"] = "12345"; のように連想配列で指定します。

$urlで実行されるPHPは、呼び出し側とは別セッションになります。セッションでもデータ渡しの場合、POSTクエリーにセッションIDを渡す必要があります。戻ってくると、元のセッションが保持されています。

また、この関数を a.php で実行し、ここから b.php にPOSTリクエストを送っても、アドレスバーの表示は a.php のまんまです。コードを見れば明らかですが。。。
実際にPOSTした時のように、アドレスバーに b.php が表示されると一番ありがたいんだが。。。

2.ソケット(fsockopen)を使う

ソケットで該当するURLにデータを送り込んで、その結果を待ちます。
参考URL:PHPプロ!Q&A掲示板 サーバーから直接POSTデータを送信したい

これを使った作った簡単な(笑)関数。インターフェイスは1のcURL版と同じです。

function http_post($url,$postdata="",$redirect="")
{
//host名
$urls = parse_url($url);
$host = $urls["host"];

//POSTに設定するパラメータ
if ($postdata == "")
$param = "";
else {
$param = "";
while (list($name,$value) = each($postdata)) {
if ($param != "") $param .= "&";
$param .= $name."=".$value;
}
}

$request = "POST ".$url." HTTP/1.0\r\n";
$request.= "Host: ".$host."\r\n";
$request.= "Content-type: application/x-www-form-urlencoded;\r\n";
$request.= "Content-Length: ".strlen($param)."\r\n";
$request.= "\r\n";
$request.= $param."\r\n";
//POSTリクエスト送信
$fp = @fsockopen($host,80,$errno,$errstr,120);
if (!$fp) {
return;
}
socket_set_timeout($fp,120);
fputs($fp,$request);

// レスポンスを格納
$response = "";
while(!feof($fp)) {
$response .= fgets($fp);
}
fclose($fp);

//リダイレクトがある場合はそのページへ
if ($redirect != "") {
header("Location: ".$redirect);
exit;
}
//リダイレクトがない場合は結果を表示
else {
//ヘッダ部分とボディ部分を分離
$data = split("\r\n\r\n",$response,2);
//メッセージボディを出力
print $data[1];
}
}

別セッション、アドレスバーの表示は、1のcURL版と同じです。

3.stream_get_contentsを使う

PHPプロ!ニュース cURLを使わずに、PHPでPOSTリクエストを送信する に、その内容が書かれているんですが、私のサーバ環境ではうまく動作しませんでした。

4.file_get_contentsを使う

とても簡単にPHPからPOSTリクエストを送信する方法 [PHP, Tips] に、その内容が書かれているんですが、http_build_query() がPHP5.0以上なので、私のサーバでは動きませんでした。


5.PEARを使う

PEARのインストールが面倒だったので、やってません。。。
やり方は検索するといろいろ出てきます。
参考までに
PHPからPear::HTTP_RequestでGET/POSTする


その他、参考にしたサイト
hiyuzawa.jpn.org php curlをつかったオリジナルクラス (myCurlRequest)
問題解決のための情報源 HTTPリクエスト
Thinking of you my dear.... PHPでフォームを介さずにGETとPOSTを送信する
JUNICHI OKA : IT - ITメモ PHPでフォームを介さずにGETとPOSTを送信する

2008年07月24日 04:36 | Webシステム


トラックバック

このエントリーのトラックバックURL:

コメント

コメントしてください




保存しますか?