TOP書籍連動> サーバファイルを書く
SOAPの紹介
SOAPの紹介

第4回:アプリケーションの設計

著者:Alessandro Sfondrini   2006/3/17
前のページ  1  2   3  次のページ
サーバファイルを書く

   リスト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()へ渡すだけです。

前のページ  1  2   3  次のページ


Alessandro Sfondrini
著者プロフィール
Alessandro Sfondrini
イタリアのコモ出身の若いプログラマであり、PHPとC言語に関連したWebサービスに興味をもっています。また、近日出版される『php|a Nanobook"Practical Web Services"』の著者です。


INDEX
第4回:アプリケーションの設計
  アプリケーションの設計
サーバファイルを書く
  本連載で紹介したアプリケーションが可能とすること