今回、著者たちが作成するアプリケーションは2つのリストから構成されます。"client.php"(リスト2)は、リモートアプリケーションにリクエストを送り、そのレスポンスを取得するように設計されています。
リスト2
<?php
/* クライアントファイル */
require("nusoap.php");
$s = new soapclient("http://host/server.php");
/* クライアントオブジェクトを作成 */
$params = array('tid'=>4636, // トランザクションID
'cid'=>1059);// 顧客ID
$res = $s -> call('get_transaction', $params);
/* リモートメソッドの呼び出し */
if(isset($fault)) // もしfaultが起きた場合
die($fault); // それを表示し終了
if($params['tid'] != $res['tid'])
die('トランザクションIDが一致しません');
if($params['cid'] != $res['cid'])
die('顧客IDが一致しません');
/* tid と cid のチェック */
echo '量 '.$res['amount'].' ステータス '.$res['status'];
?>
一方、server.php(リスト3)ではリクエストを受信し、処理した後に、レスポンスを送信する出力を生成します。SOAP は、連続した文字列と変数による単純なリクエストを「手動で」書くことができます。
リスト3
<?php
/* SERVER FILE */
if($_SERVER["REQUEST_METHOD"] != "POST")
exit; // メソッドがPOSTかどうかリクエストをチェック
require("nusoap.php");
$s = new soap_server;
/* サーバオブジェクトを作成 */
$s -> register('get_transaction');
/* メソッドを登録 */
function get_transaction($tid, $cid)
{
if(!is_int($tid) || !is_int($cid))
return new soap_fault("Sender","Input err",
"ID type must be INTEGER"); // データタイプ fault
$q = "SELECT tid,cid,amount,status FROM transactions"
." WHERE tid = $tid AND cid = $cid"; // MySQLクエリ
if(($conn = @mysql_connect()) === FALSE)
return new soap_fault("Receiver", "MySQL",
mysql_error()); // MySQL接続. fault
if((@mysql_select_db("liceogiovio_", $conn)) === FALSE)
return new soap_fault("Receiver", "MySQL",
mysql_error()); // MySQLのデータベース選択 fault
$res = @mysql_query($q, $conn);
if(mysql_num_rows($res) != 1)
return new soap_fault("Sender", "Bad IDs",
"No record matches the IDs"); // 結果がない場合
$resp = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_close($conn);
$resp["time"] = time(); // time()の値を追加
return $resp; // 結果を返す
}
$s -> service($HTTP_RAW_POST_DATA); // RPCを実行
?>
|