リスト3では、サーバ用のコードを見ることが出来ます。
リスト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を実行
?>
サーバファイルはWebブラウザではなく、POST経由でリモートアプリケーションによって実行されるように設定されています。よって、最初にリクエストメソッドがPOSTかどうかを確認します。POSTでない場合、プログラムが終了してしまうからです。
さらに、リモートアプリケーションのIPを確認したり、ユーザ名やパスワードを要求することができます。この場合、データを安全に送信するために、HTTPの代わりにHTTPSを使用しなければならないことに注意してください。
次に、NuSOAPをインクルードして、サーバオブジェクト($s)を作成し、メソッド(get_transaction())を登録します。コード中で興味深い部分はこの関数です。トランザクションIDと顧客IDの2つのパラメータを要求します。これらは、MySQLクエリをビルドするために使用されます。
関数の最初のステップでは、パラメータのデータタイプが整数であるかを確認します。それでなければ、エラーメッセージを出力します。このメッセージは一見の価値があります。
die()は使用せず、NuSOAPのsoap_fault()メソッドを使用してSOAP Faultドキュメントを実行するからです。次の3つのプロパティを指定します。
- faultコードは、クライアント、またはサーバのどちらにエラーが存在するか確認します。クライアントが送信した入力のデータタイプが間違っている場合、「Sender」が設定されます。
- Reasonには、「Input err」が設定されます。
- Detailは発生した問題を説明します。もちろん、returnを使用してSOAP Faultドキュメントを生成して、get_transaction()が他のオペレーションを実行しないようにします。
表4:soap_fault()メソッドを使用する際に使用するプロパティ
次に、MySQLクエリを作成して$qに格納します。MySQLに接続してデータベースを選択して、各手順が成功したか確認します。失敗した場合は、Faultが生成されます。一度クエリを実行したら、返された結果を考察します。「N < 1 」の場合はエラーが起きます。「N < 1」は、クエリを実行しても結果がないという意味です。
ということで、「N != 1」としてこれらの2つの条件をまとめて表します。最後に、結果を備えた連想配列を検索して、time()の値を記録したtime要素を追加します。オペレーションが実行された場合、$resp配列が返されます。リモートプロシージャコールを実行するには、入力として生のPOSTデータをservice()へ渡すだけです。
|