PHP5を試してみる - SOAP extension+Google Web APIsでGoogle検索してみる
サンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。
以前にPEAR SOAP+Google Web APIsでGoogle検索してみましたが、PHP5.0.0RC1で大幅改訂(?)されたSOAP extensionを使って試してみました。
このextensionは、元々PHPモジュールとして開発されていたモノがPHP5に(ようやく)取り込まれたモノのようです。関数(というかクラス)ドキュメントは、PHP日本語マニュアルにもありますのでどうぞ。
サンプルの内容は、前回と同様、Googleの検索をWebサービス経由で行うサンプルです。ということで、Google Web APIsの入手方法などの詳細については、PEAR SOAPのページをご覧下さい。。。(^-^;
前準備でPEAR版と異なるところは、「SOAP extension」、つまりPHP拡張モジュールとしての機能になりますので、configure時にオプションを付けてbuildすることになります(ひょっとして、PHP4.0.xの頃のmbstring/mbregexのように「後付け」もOK?未確認)。今回は、configure時に「--enable-soap」を付けてbuildしたPHP5.0.0RC1を使用しました。
なお、前回と同様、GoogleSearch.wsdlは、サンプルと同じディレクトリにコピーしておいてください。
さて、今回のPHPスクリプトの方ですが、
- WSDLを元にSOAPClientインスタンスを作成
- 生成したSOAPClientを使ってサービスメソッドをコールし、結果を取得
- 結果を表示
といったお決まりのパターンですが、PEAR SOAP版の時に作成したproxyオブジェクトを使わない以外はほとんど同じコードでOKです。ただ、今回はページャー(何ページ目を表示する)など、ちょっと色気を出してみました。でも、手は抜いてます。。。(^-^;
PEAR SOAPのコードがあったこともあり、意外とあっさり動いてしまいました。実際に動作を確認したい方は、EXPERIENCEのページへどうぞ。
●google.php
<?php
static $COUNT_PER_PAGE = 10;
static $GOOGLE_KEY = [Google Web APIsのライセンスキー[を指定する];
?>
●SOAP extension+Google Web APIsでGoogle検索してみる at <?php echo phpversion(); ?>
<hr>
<form action="google.php" method="get">
キーワード:<input type="text" name="query" value="<?php echo isset($_GET["query"])
? htmlspecialchars(mb_convert_encoding($_GET["query"], "euc-jp", "auto"))
: ""; ?>">
<input type="submit">
</form>
<?php
if (isset($_GET["query"])) {
try {
$client = new SOAPClient("GoogleSearch.wsdl");
$query = mb_convert_encoding($_GET["query"], "utf-8", "auto");
$page = (isset($_GET["page"]) ? $_GET["page"]++ : 0);
$result = $client->doGoogleSearch(
$GOOGLE_KEY,
$query,
($page * $COUNT_PER_PAGE), $COUNT_PER_PAGE, true, "countryJP", false, "lang_ja", "utf-8", "utf-8" );
}
catch (SoapFault $e) {
echo $e; exit;
}
?>
<hr>
<p>●検索結果</p>
検索時間:<?php echo $result->searchTime; ?> sec /
全<?php echo $result->estimatedTotalResultsCount; ?>件
<?php
$max_page = ceil($result->estimatedTotalResultsCount / $COUNT_PER_PAGE);
for ($i = 0; $i < $max_page; $i++) {
$current = ($i + 1);
if ($i == $page) {
echo "$current ";
}
else {
echo "<a href=\"google.php?query="
. urlencode(mb_convert_encoding($_GET["query"], "shift_jis", "auto"))
. "&page=$i\">$current</a> ";
}
}
?>
<ul>
<?php
foreach ($result->resultElements as $index => $obj) {
$title = mb_convert_encoding($obj->title, mb_internal_encoding(), 'auto');
$snippet = mb_convert_encoding($obj->snippet, mb_internal_encoding(), 'auto');
echo "<dl>";
echo "<dt><a href=\"" . $obj->URL . "\">" . $title . "</a></dt>";
echo "<dd>" . $obj->URL . "</dd>";
echo "<dd>" . $snippet . "</dd>";
echo "</dl>";
}
echo '<pre>';
print_r($result);
echo '</pre>';
}
?>
[2004/03/23] 上記サンプルに「SoapFault」というクラスがでてきていますが、このクラスは組み込みクラスのExceptionクラスを継承しており、SOAPコールが失敗した場合にthrowされるようです。doyouphpのページからSoapFaultクラスを見るとextendsしていることが分かります。その他の情報は、PHP日本語マニュアルをどうぞ。試しに、$GOOGLE_KEYの値を空文字にして実行してみると、以下のように表示されます。
●$GOOGLE_KEYの値を空文字にした場合の出力(適宜改行しています)SoapFault exception: [SOAP-ENV:Server] Exception from service object:
Invalid authorization key: in /path/to/google.php:48
Stack trace:
#0 /path/to/google.php(48): soapclient->doGoogleSearch()
#1 {main}
ふふふ。。。またいろいろと遊べそうです(^-^;
|