2012年4月24日火曜日

HTTP通信

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

コメントを投稿