Xml-rpc-quick-guide
XML-RPC-はじめに
RPCは、リモートプロシージャコールの略です。 名前が示すように、リモートコンピューターで利用可能なプロシージャまたは関数を呼び出すメカニズムです。 RPCはWebよりもはるかに古いテクノロジーです。 事実上、RPCは開発者にネットワーク経由で呼び出すことができるインターフェイスを定義するためのメカニズムを提供します。 これらのインターフェースは、単一の関数呼び出しのように単純な場合もあれば、大規模なAPIのように複雑な場合もあります。
XML-RPCとは何ですか?
XML-RPCは、コンピューターが他のコンピューターでプロシージャを簡単に呼び出せるようにする、最もシンプルで最も簡単なWebサービスアプローチの1つです。
- XML-RPCを使用すると、プログラムはネットワークを介して関数またはプロシージャを呼び出すことができます。
- XML-RPCは、HTTPプロトコルを使用して、クライアントコンピューターからサーバーコンピューターに情報を渡します。
- XML-RPCは、小さなXML語彙を使用して、要求と応答の性質を記述します。
- XML-RPCクライアントは、XML要求でプロシージャ名とパラメーターを指定し、サーバーはXML応答でエラーまたは応答を返します。
- XML-RPCパラメーターは、タイプとコンテンツの単純なリストです-構造体と配列は、利用可能な最も複雑なタイプです。
- XML-RPCにはオブジェクトの概念がなく、他のXMLボキャブラリーを使用する情報を含めるためのメカニズムもありません。
- ただし、XML-RPCとWebサービスを使用すると、Webは手続き型接続の集合になり、コンピューターは緊密にバインドされたパスに沿って情報を交換します。
- XML-RPCは1998年初頭に登場しました。 UserLand Softwareによって公開され、当初はFrontier製品に実装されていました。
なぜXML-RPCなのか?
複数のコンピューティング環境を統合する必要があるが、複雑なデータ構造を直接共有する必要がない場合、XML-RPCを使用すると、迅速かつ簡単に通信を確立できます。
単一の環境で作業している場合でも、RPCアプローチを使用すると、異なるデータモデルまたは処理の期待値を持つプログラムを簡単に接続でき、再利用可能なロジックに簡単にアクセスできることがわかります。
- XML-RPCは、コンピューター間のさまざまな接続を確立するための優れたツールです。
- XML-RPCは、インテグレーターに情報交換のための標準的な語彙とアプローチを使用する機会を提供します。
- XML-RPCの最も明白なアプリケーション分野は、さまざまな種類の環境を接続し、JavaがPerl、Python、ASPなどと通信できるようにすることです。
XML-RPC技術概要
XML-RPCは、次の3つの比較的小さな部分で構成されています。
- * XML-RPCデータモデル*:パラメーター、戻り値、およびエラー(エラーメッセージ)を渡す際に使用する一連のタイプ。
- * XML-RPCリクエスト構造*:メソッドおよびパラメーター情報を含むHTTP POSTリクエスト。
- * XML-RPC応答構造*:戻り値または障害情報を含むHTTP応答。
次の3つの章では、これら3つのコンポーネントすべてを学習します。
XML-RPC-データモデル
XML-RPC仕様では、6つの基本データ型と、型の組み合わせを表す2つの複合データ型が定義されています。
XML-RPCの基本データ型
Type | Value | Examples |
---|---|---|
int or i4 | 32-bit integers between - 2,147,483,648 and 2,147,483,647. |
<int>27</int> <i4> 27 </i4> |
double | 64-bit floating-point numbers |
<double>27.31415</double> <double> -1.1465 </double> |
Boolean | true (1) or false (0) |
<boolean>1</boolean> <boolean> 0 </boolean> |
string | ASCII text, though many implementations support Unicode |
<string>Hello</string> <string>おかしな! @ </string> |
dateTime.iso8601 | Dates in ISO8601 format: CCYYMMDDTHH:MM:SS |
<dateTime.iso8601> 20021125T02:20:04 </dateTime.iso8601> <dateTime.iso8601> 20020104T17:27:30 </dateTime.iso8601> |
base64 | Binary information encoded as Base 64, as defined in RFC 2045 | <base64>SGVsbG8sIFdvcmxkIQ==</base64> |
これらの基本型は常に_value_要素で囲まれています。 文字列(および文字列のみ)は_value_要素で囲むことができますが、_string_要素は省略できます。 これらの基本型は、2つのより複雑な型、配列、および構造体に結合できます。 配列はシーケンシャルな情報を表し、構造体はハッシュテーブル、連想配列、またはプロパティによく似た名前と値のペアを表します。
配列は、値のリストを保持する_data_要素を含む_array_要素によって示されます。 他のデータ型と同様に、_array_要素は_value_要素で囲む必要があります。 たとえば、次のarraycontainには4つの文字列が含まれます。
<value>
<array>
<data>
<value><string>This </string></value>
<value><string>is </string></value>
<value><string>an </string></value>
<value><string>array.</string></value>
</data>
</array>
</value>
次の配列には4つの整数が含まれます。
<value>
<array>
<data>
<value><int>7</int></value>
<value><int>1247</int></value>
<value><int>-91</int></value>
<value><int>42</int></value>
</data>
</array>
</value>
ここに示すように、配列にはさまざまなタイプの混合物を含めることもできます。
<value>
<array>
<data>
<value><boolean>1</boolean></value>
<value><string>Chaotic collection, eh?</string></value>
<value><int>-91</int></value>
<value><double>42.14159265</double></value>
</data>
</array>
</value>
多次元配列の作成は簡単です-配列内に配列を追加するだけです:
<value>
<array>
<data>
<value>
<array>
<data>
<value><int>10</int></value>
<value><int>20</int></value>
<value><int>30</int></value>
</data>
</array>
</value>
<value>
<array>
<data>
<value><int>15</int></value>
<value><int>25</int></value>
<value><int>35</int></value>
</data>
</array>
</value>
</data>
</array>
</value>
単純な構造体は次のようになります。
<value>
<struct>
<member>
<name>givenName</name>
<value><string>Joseph</string></value>
</member>
<member>
<name>familyName</name>
<value><string>DiNardo</string></value>
</member>
<member>
<name>age</name>
<value><int>27</int></value>
</member>
</struct>
</value>
この方法により、任意のプログラミング言語でサポートされるほぼすべてのデータ型を実装できます。
XML-RPC-リクエスト形式
XML-RPCリクエストは、XMLコンテンツとHTTPヘッダーの組み合わせです。 XMLコンテンツは、データ型指定構造を使用してパラメーターを渡し、どのプロシージャが呼び出されているかを識別する追加情報を含みます。HTTPヘッダーは、Web経由で要求を渡すためのラッパーを提供します。
各リクエストには単一のXMLドキュメントが含まれ、そのルート要素は_methodCall_要素です。 各_methodCall_要素には、_methodName_要素と_params_要素が含まれます。 _methodName_要素は呼び出されるプロシージャの名前を識別しますが、_params_要素にはパラメーターとその値のリストが含まれます。 各_params_要素には、_value_要素を含むparam要素のリストが含まれます。
たとえば、(半径の)_Double_パラメーターを受け取る_circleArea_というメソッドにリクエストを渡すには、XML-RPCリクエストは次のようになります。
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
これらの要求のHTTPヘッダーには、送信者とコンテンツが反映されます。 基本的なテンプレートは次のようになります。
POST/target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes
たとえば、circleAreaメソッドが_/xmlrpc_でリッスンしているXML-RPCサーバーから利用できる場合、リクエストは次のようになります。
POST/xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
組み立てられると、リクエスト全体は次のようになります。
POST/xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
これは通常のHTTPリクエストであり、慎重に構築されたペイロードがあります。
XML-RPC-応答形式
レスポンスはリクエストによく似ていますが、いくつかの追加の工夫が加えられています。 応答が成功した場合-プロシージャが見つかり、正しく実行され、結果が返された場合-XML-RPC応答は、_methodCall_要素が_methodResponse_要素に置き換えられ、_methodName_要素が存在しないことを除いて、要求によく似ています。
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
- XML-RPC応答に含めることができるパラメーターは1つだけです。
- そのパラメーターは配列または構造体である可能性があるため、複数の値を返すことが可能です。
- 応答で値を返すことが常に必要です。 「成功値」-おそらくtrue(1)に設定されたブール値。
要求と同様に、応答はHTTPにパッケージ化され、HTTPヘッダーがあります。 メッセージに障害が含まれている場合でも、すべてのXML-RPC応答は200 OK応答コードを使用します。 ヘッダーは、リクエストと同様の一般的な構造を使用し、ヘッダーの典型的なセットは次のようになります。
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
- XML-RPCはHTTP 1.0サポートのみを必要としますが、HTTP 1.1は互換性があります。
- Content-Typeはtext/xmlに設定する必要があります。
- Content-Lengthヘッダーは、応答の長さをバイト単位で指定します。
ヘッダーと応答ペイロードの両方を含む完全な応答は、次のようになります。
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
応答がXML-RPCサーバーからXML-RPCクライアントに配信された後、接続が閉じられます。 フォローアップ要求は、個別のXML-RPC接続として送信する必要があります。
XML-RPC-障害フォーマット
XML-RPCフォールトは応答の一種です。 XML-RPCリクエストの処理で問題が発生した場合、_methodResponse_要素にはparams要素ではなくfault要素が含まれます。 _params_要素のようなfault要素には、何か問題が発生したことを示す単一の値のみがあります。 障害応答は次のようになります。
<?xml version="1.0"?>
<methodResponse>
<fault>
<value><string>No such method!</string></value>
</fault>
</methodResponse>
障害にはエラーコードも含まれます。 XML-RPCはエラーコードをまったく標準化しません。 特定のパッケージのドキュメントをチェックして、それらが障害を処理する方法を確認する必要があります。
障害応答は次のようにもなります。
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>code</name>
<value><int>26</int></value>
</member>
<member>
<name>message</name>
<value><string>No such method!</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
XML-RPC-例
XML-RPCを実証するために、Javaを使用してXML-RPCメッセージを処理するサーバーを作成し、そのサーバーでプロシージャを呼び出すJavaクライアントを作成します。
会話のJava側は、http://xml.apache.org/xmlrpc/で入手可能なApache XMLプロジェクトのApache XML-RPCを使用します。
すべての.jarファイルを適切なパスに配置し、JAVAを使用して1つのクライアントと1つの小さなXML-RPCサーバーを作成します。
XML-RPCクライアント
sum functionという関数を呼び出すXML-RPCクライアントを記述しましょう。 この関数は2つのパラメーターを取り、それらの合計を返します。
import java.util.*;
import org.apache.xmlrpc.*;
public class JavaClient {
public static void main (String [] args) {
try {
XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = server.execute("sample.sum", params);
int sum = ((Integer) result).intValue();
System.out.println("The sum is: "+ sum);
} catch (Exception exception) {
System.err.println("JavaClient: " + exception);
}
}
}
上記のクライアント例で何が起こったのか見てみましょう。
- Javaパッケージorg.apache.xmlrpcには、XML-RPC JavaクライアントおよびXML-RPCサーバー(XmlRpcClientなど)のクラスが含まれています。
- パッケージjava.utilは、Vectorクラスに必要です。
- 関数_server.execute(…)_は、リクエストをサーバーに送信します。 プロシージャsum(17,13)は、ローカルプロシージャであるかのようにサーバー上で呼び出されます。 プロシージャコールの戻り値は常にオブジェクトです。
- ここで、「サンプル」はサーバーで定義されているハンドラーを示します。
- プロシージャコールのすべてのパラメーターは常にベクターに収集されることに注意してください。
- XmlRpcClientクラスは、サーバーマシンの「Webアドレス」に続いて/RPC2を指定することにより構築されます。
- localhost-ローカルマシンを意味します
- localhostの代わりにIP番号を指定できます。 194.80.215.219
- xyz.dyndns.orgのようなドメイン名を指定できます
- ポート番号とドメイン名をxyz.dyndns.org:8080のように指定できます。 デフォルトのポートは80です
- リモートプロシージャコールの結果は常にオブジェクトであり、適切な型にキャストする必要があることに注意してください。
- 問題が発生した場合(接続がないなど)、例外がスローされ、_catch_ステートメントを使用してキャッチする必要があります。
上記の呼び出しにより、クライアントは次のメッセージをサーバーに送信します。 これは_server.execute(…)_によって内部的に処理され、それとは何の関係もないことに注意してください。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
<methodName>sample.sum</methodName>
<params>
<param>
<value><int>17</int></value>
</param>
<param>
<value><int>13</int></value>
</param>
</params>
</methodCall>
XML-RPCサーバー
以下は、Javaで記述されたXML-RPCサーバーのソースコードです。 _org.apache.xmlrpc。* _で利用可能な組み込みクラスを利用します
import org.apache.xmlrpc.*;
public class JavaServer {
public Integer sum(int x, int y){
return new Integer(x+y);
}
public static void main (String [] args){
try {
System.out.println("Attempting to start XML-RPC Server...");
WebServer server = new WebServer(80);
server.addHandler("sample", new JavaServer());
server.start();
System.out.println("Started successfully.");
System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception){
System.err.println("JavaServer: " + exception);
}
}
}
上記のサンプルサーバーで行ったことを見てみましょう。
- パッケージorg.apache.xmlrpcには、XML-RPCサーバー実装用のクラスWebServerが含まれています。
- リモートで呼び出されるプロシージャ_sum_は、クラスのパブリックメソッドとして実装されます。
- 次に、同じサーバークラスのインスタンスが、クライアントからアクセス可能なハンドラーに関連付けられます。
- サーバーはポート番号(ここでは80)で初期化されます。
- 問題が発生すると、例外がスローされ、_catch_ステートメントを使用してキャッチする必要があります。
指定されたクライアント例で言及されている呼び出しに対して、サーバーはクライアントに次の応答を送り返します。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>30</int></value>
</param>
</params>
</methodResponse>
これでサーバーの準備ができたので、プロンプトで次のようにコンパイルして実行します。
C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)
次に、機能をテストするために、次のようにこのサーバーに呼び出しを行います。
C:\ora\xmlrpc\java>java JavaClient
30
XML-RPC-まとめ
このチュートリアルでは、XML-RPCとは何か、なぜXML-RPCが必要なのかを学びました。 データモデル、およびクライアントとサーバー間で交換される要求および応答メッセージの形式について説明しました。 XML-RPCクライアントとサーバーが情報交換のためにどのように機能するかを示すために、1つの例を示しました。
XML-RPCは、限られた機能セットを持つ非常に単純な概念です。 これらの制限は、多くの点でXML-RPCの最も魅力的な機能であり、プロトコルの実装とその相互運用性のテストの難しさを大幅に軽減します。
XML-RPCは単純ですが、単純なツールの創造的なアプリケーションは、洗練された強力なアーキテクチャを作成できます。 多種多様なシステムが通信する必要がある場合、XML-RPCが最も適切な最小公分母である可能性があります。
次は何ですか?
次のステップは、WSDLとSOAPを学ぶことです。
WSDL
WSDLは、Webサービスとそれらへのアクセス方法を記述するためのXMLベースの言語です。
WSDLは、Webサービスのメッセージ形式とプロトコル詳細とともにWebサービスを記述します。
WSDLの詳細については、リンク:/wsdl/index [WSDLチュートリアル]をご覧ください。
SOAP
SOAPは、アプリケーションがHTTP経由で情報を交換できるようにする単純なXMLベースのプロトコルです。
SOAPの詳細については、リンク:/soap/index [SOAPチュートリアル]をご覧ください。