4. XML_RPC に基づく Web サービス
XML_RPC を使用してサービスを構築および使用すると非常に便利です。企業は、自社が提供するさまざまなサービスのために XML_RPC サーバーを展開し、ユーザー、クライアント ソフトウェア、およびクライアント企業はこのサービスを使用して、エンド ユーザー向けのハイエンド サービスやアプリケーションを構築できます。より効果的で、安価で、高品質なサービスを提供するためのこの競争により、アプリケーション サービスの品質が大幅に向上します。
しかし、Web 上でサービスをカタログ化、インデックス付け、検索する方法など、解決すべき問題がまだいくつかあります。 UDDI はこの問題の解決を試みていますが、標準は単純ではなく、それに対する業界の対応も不透明です。ただし、XML_RPC を企業内に適用すると、コードの再利用性が向上するだけでなく、今後数年間で重要な知識の宝となる新しい分散コンピューティング モデルがもたらされます。 XML_RPC の開発は、分散コンピューティングの問題を解決することから始まり、サービス Web の基本レベルとなり、非常に良いスタートを切りました。この標準に対する人々の熱意は確実に続くでしょう。ここでは、XML_RPC の実際のアプリケーションを見てみましょう。
4.1 PHP での XML_RPC の適用
PHP は、Web サービスを提供するのに理想的な言語です。 PHP コードを記述して適切な場所に配置するだけで、URL を通じて「呼び出す」ことができるサービスがすぐに作成されます。 PHP での XML_RPC 実装は複雑な場合もあれば単純な場合もありますが、多くのオプションがあります。ここでは、Useful Information Company の XML_RPC 実装を選択します。そのコードとドキュメントは http://xmlrpc.usefulinc.com/ からダウンロードできます。
この XML_RPC 実装の基本クラスには 2 つのファイルが含まれます:
xmlrpc.inc: XML_RPC の php クライアントに必要なクラスが含まれます
xmlrpcs.inc: XML_RPC の php サーバーに必要なクラスが含まれます
4.2 クライアント
XML_RPC クライアントの作成とは、次のことを意味します:
1. XML_RPC リクエスト メッセージを作成します
2. XML_RPC メッセージを作成します
4. 応答を取得します
6.応答を解釈します
次の例を参照してください:
<?php
$f=new xmlrpcmsg('examples.getStateName',array(new xmlrpcval(14, "int"))); "/RPC2 ", "betty.userland.com", 80);
$r=$c->send($f);
$v=$r->value(); ->faultCode()) {
print "ステータスコード" . $HTTP_POST_VARS["stateno"] . "
";はサーバーのResponse<BR><PRE>" .
htmlentities($r->serialize()). "</PRE><HR>n";
} else {
print "エラー: ";
print "コード: " . $r->faultCode() .
" 理由: '" .$r->faultString()."'
";
}
?>
この例では、まず、 create 「examples.getStateName」メソッドを呼び出し、値が 14 の「int」型の整数パラメータを渡す XML_RPC メッセージ。次に、呼び出される URL (パス、ドメイン、ポート) を記述するクライアントを作成します。次に、メッセージを送信し、応答オブジェクトを受信して、エラーをチェックしました。エラーがなければ結果を表示します。
RPC クライアント プログラムを作成するときに使用される主な関数は次のとおりです:
クライアントを作成するには:
$client=new xmlrpc_client($server_path, $server_hostname, $server_port);
メッセージの送信方法は次のとおりです。
$response=$client->send($xmlrpc_message);
xmlrpcresp のインスタンスを返します。渡すメッセージは、次のメソッドで作成された xmlrpcmsg のインスタンスです:
$msg=new xmlrpcmsg($methodName, $parameterArray);
methodName は呼び出されるメソッド (プロセス) の名前です。 parameterArray は、xmlrpcval オブジェクトの PHP 配列です。例:
$msg=new xmlrpcmsg("examples.getStateName", array(new xmlrpcval(23, "int")));
xmlrpcval オブジェクトは次の形式で作成できます:
<?php
$ myVal=new xmlrpcval($stringVal);
$myVal=new xmlrpcval, "int" | "boolean" | "string" | "dateTime.iso8601" | "base64"); new xmlrpcval( $arrayVal, "array" | "struct");
?>
最初の形式は、xmlrpc 文字列値を作成します。 2 番目の形式は、値と型を説明する値を作成します。 3 番目の形式は、配列のような構造で他の xmlrpc 値を結合することによって複雑なオブジェクトを作成します。例:
<?php
$myArray=new xmlrpcval(array(new xmlrpcval("Tom"), new xmlrpcval("Dick) "),new xmlrpcval("Harry")), "array");
$myStruct=new xmlrpcval(array(
"name" => new xmlrpcval("Tom"),
"age" => new xmlrpcval (34, "int"),
"geek" => new xmlrpcval(1, "boolean")),"struct");
?>
の send メソッドを呼び出すことにより、応答オブジェクトは xmlrpcresp 型になります。顧客オブジェクトを取得します。サーバー側では、次のように xmlrpcresp 型のオブジェクトを作成できます:
$resp=new xmlrpcresp($xmlrpcval); クライアント側では、次のメソッドを使用して応答から xmlrpcval を取得します:
$xmlrpcVal =$resp ->value();
次に、次のメソッドを使用して、応答結果を記述する PHP 変数を取得できます。
$scalarVal=$val->scalarval(); 複雑なデータ型の場合、非常に便利な関数が 2 つあり、どちらも xmlrpc.inc にあります:
$arr=xmlrpc_decode($xmlrpc_val);
この関数は、xmlrpcval 変数 $xmlrpc_val のデータを含む PHP 配列を返します。 PHP自体が持つ変数型に変換されています。
$xmlrpc_val=xmlrpc_encode($phpval);
この関数は、$phpval で記述された PHP データを含む xmlrpcval 型の値を返します。配列と構造体の場合、このメソッドにより再帰的分析が可能になります。非基本データ型 (base-64 データや日付時刻データなど) はサポートされていないことに注意してください。
4.3 サーバーサイド
xmlrpcs.inc が提供するクラス作成サービスを使用するのは非常に簡単です。サービスを作成するには、次のように xmlrpc_server のインスタンスを作成します:
<?php
$s=new xmlrpc_server( array("examples.myFunc" =>
array("function" => "foo")) );
?>
xmlrpc_server コンストラクターに渡されるのは、連想配列の連想配列です。プロシージャ「examples.myFunc」は「foo」関数を呼び出します。このため、foo はメソッド ハンドルと呼ばれます。
メソッドハンドルの記述は簡単です。メソッド ハンドルのスケルトンは次のとおりです:
<?php
function foo ($params) {
global $xmlrpcerruser; // ユーザー エラー コード値を導入します
// $params は xmlrpcval オブジェクトの配列です
if ( $err) {
// エラー条件
return new xmlrpcresp(0, $xmlrpcerruser+1, // ユーザー エラー 1
"エラー!")
} else {
// 成功
return new xmlrpcresp(new xmlrpcval(" Fine!" , "string"));
}
}
?>
プログラムがエラーをチェックし、エラーがある場合はエラーを返します ($xmlrpcerruser+1 から開始します)。そうでない場合は、すべてが正常であれば、成功メッセージとして説明操作 xmlrpcresp が返されます。
5. アプリケーション例
次の例では、サービスを構築します。指定された値 n に対して、サービスは n*2 を返します。クライアントはこのサービスを使用して 5*2 の値を計算します。
サーバー側のコードは次のとおりです:
include("xmlrpc.inc");
function foo ($params)
{
global $xmlrpcerruser; // ユーザーにエラー コード値を紹介します
// $params は xmlrpcval オブジェクトの配列です
$vala=$params->params[0];
$ret=$ sval*2;
return new xmlrpcval($ret, "int"))
}
$s=new xmlrpc_server( array("function" => "foo") )));
?>
クライアントコードは次のとおりです:
<?php
include("xmlrpc.inc");
if ($HTTP_POST_VARS["number"]!="") {
$ f=new xmlrpcmsg(' product',array(new xmlrpcval($HTTP_POST_VARS["number"], "int")));
$c=new xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia. com.ar", 80 );
$c->setDebug(0);
$r=$c->send($f);
$v=$r->value();
if ( !$r->faultCode()) {
print ". $HTTP_POST_VARS["number"] . " .
$v->scalarval() "
; >サーバーからの結果です!<BR><PRE>" .
htmlentities($r->serialize()). "