PHPで他のサーバーとHTTP通信してみます。
いろいろあるけど、一番簡単なのは、 "file_get_contents"を使ったやり方じゃないかな。
○HTTP通信結果をHTTPの結果らしく出力する。(POST方式)
$url = 'http://www.google.co.jp/ig';
//POSTデータ
$data = array(
"name1" => "value3",
"name2" => "value2",
"name3" => "value3"
);
$data = http_build_query($data, "&");
//Request Header
$header = array(
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: ".strlen($data)
);
$header = implode("\r\n", $header);
//context生成
$context = array(
"http" => array(
"method" => "POST",
"header" => $header,
"content" => $data
)
);
//送信、戻り値はレスポンスのデータ部
$out = file_get_contents($url, false, stream_context_create($context));
//レスポンスヘッダーを出力
foreach ($http_response_header as $header){
echo($header . '<br/>');
}
echo('<br/>');
//レスポンスデータ部をエスケープして出力
echo(htmlspecialchars($out));
・リクエスト
ヘッダーにContent-Lengthを記述するので、データ部から先に生成しています。
(Content-Length書かなかったらHTTPステータス411(Length Required)で返すサーバーのほうがほとんどじゃないかな。)
・レスポンス
file_get_contentsでHTTP通信すると、レスポンスヘッダーは、$http_response_headerから取得できる。
昔の言語っぽいよね。
先に関数作っちゃったから、仕方なかったのかも?
○HTTP通信結果をHTTPの結果らしく出力する。(GET方式)
$url = 'http://www.google.co.jp/';
//GETデータ
$data = array(
"name1" => "value3",
"name2" => "value2",
"name3" => "value3"
);
$data = http_build_query($data, "&");
//Request Header
$header = array(
"Content-Type: application/x-www-form-urlencoded",
);
$header = implode("\r\n", $header);
//context生成
$context = array(
"http" => array(
"method" => "GET",
"header" => $header,
)
);
//送信、戻り値はレスポンスのデータ部
$out = file_get_contents($url . '?' . $data , false, stream_context_create($context));
//レスポンスヘッダーを出力
foreach ($http_response_header as $header){
echo($header . '<br/>');
}
echo('<br/>');
//レスポンスデータ部をエスケープして出力
echo(htmlspecialchars($out));
・リクエスト
POSTより簡素。
データは、クェリ文字列として渡すこと。(※URLの末尾に?をつけてデータをつける。)
大事なのは「不要な物を入れない」こと。
例えば、GETなのにHTTPデータ部が入っているとHTTPステータス400(Bad Request)で返すサーバーもある。
・レスポンス
POST形式と別に何も変わらない。
0 件のコメント:
コメントを投稿