XML-RPC-クイックガイド

RPCはRemoteProcedureCallの略です。その名前が示すように、それはリモートコンピュータで利用可能なプロシージャまたは関数を呼び出すメカニズムです。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年の初めに登場しました。これはUserLandSoftwareによって公開され、最初はFrontier製品に実装されていました。

なぜXML-RPCなのか?

複数のコンピューティング環境を統合する必要があるが、複雑なデータ構造を直接共有する必要がない場合は、XML-RPCを使用すると通信をすばやく簡単に確立できます。

単一の環境内で作業している場合でも、RPCアプローチを使用すると、異なるデータモデルや処理の期待値を持つプログラムを簡単に接続でき、再利用可能なロジックに簡単にアクセスできることがわかります。

  • XML-RPCは、コンピューター間のさまざまな接続を確立するための優れたツールです。

  • XML-RPCは、情報を交換するための標準的な語彙とアプローチを使用する機会をインテグレーターに提供します。

  • XML-RPCの最も明白なアプリケーション分野は、さまざまな種類の環境を接続し、JavaがPerl、Python、ASPなどと通信できるようにすることです。

XML-RPC技術概要

XML-RPCは、次の3つの比較的小さな部分で構成されています。

  • XML-RPC data model :パラメーター、戻り値、および障害(エラーメッセージ)の受け渡しに使用するタイプのセット。

  • XML-RPC request structures :メソッドとパラメーターの情報を含むHTTPPOSTリクエスト。

  • XML-RPC response structures :戻り値または障害情報を含むHTTP応答。

次の3つの章では、これら3つのコンポーネントすべてについて学習します。

XML-RPC仕様では、6つの基本データ型と、型の組み合わせを表す2つの複合データ型が定義されています。

XML-RPCの基本的なデータ型

タイプ
intまたはi4 -2,147,483,648〜2,147,483,647の32ビット整数。

<int> 27 </ int>

<i4> 27 </ i4>

ダブル 64ビット浮動小数点数

<double> 27.31415 </ double>

<double> -1.1465 </ double>

ブール値 true(1)またはfalse(0)

<boolean> 1 </ boolean>

<boolean> 0 </ boolean>

ストリング ASCIIテキスト、ただし多くの実装はUnicodeをサポートしています

<string>こんにちは</ string>

<文字列>ボンカー!@ </ string>

dateTime.iso8601 ISO8601形式の日付:CCYYMMDDTHH:MM:SS

<dateTime.iso8601>

20021125T02:20:04

</ dateTime.iso8601>

<dateTime.iso8601>

20020104T17:27:30

</ dateTime.iso8601>

base64 RFC 2045で定義されているように、Base64としてエンコードされたバイナリ情報

<base64> SGVsbG8sIFdvcmxkIQ == </ base64>

これらの基本タイプは常に要素で囲まれています。文字列(および文字列のみ)はvalue要素で囲むことができますが、string要素は省略します。これらの基本型は、さらに2つの複雑な型、配列、および構造体に組み合わせることができます。配列はシーケンシャル情報を表し、構造体はハッシュテーブル、連想配列、またはプロパティのように名前と値のペアを表します。

配列は、値のリストを保持するデータ要素を含む配列要素によって示されます。他のデータ型と同様に、配列要素は要素で囲む必要があります。たとえば、次の配列には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コンテンツとHTTPヘッダーの組み合わせです。XMLコンテンツは、データ型指定構造を使用してパラメーターを渡し、呼び出されているプロシージャーを識別する追加情報を含みます。一方、HTTPヘッダーは、Webを介して要求を渡すためのラッパーを提供します。

各リクエストには、ルート要素がmethodCall要素である単一のXMLドキュメントが含まれています。各methodCall要素には、methodName要素とparams要素が含まれています。methodNameのの要素を識別しながら、呼び出される手続きの名前のparams要素は、パラメータとその値のリストが含まれています。各params要素には、要素を含む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の応答があることを除いて、要求のような多くを見ていきます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応答は200OK応答コードを使用します。ヘッダーはリクエストと同様の共通の構造を使用し、一般的なヘッダーのセットは次のようになります。

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はHTTP1.0のサポートのみを必要としますが、HTTP1.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リクエストの処理に問題があった場合、methodResponse要素にはparams要素ではなくfault要素が含まれます。params要素と同様に、fault要素には、問題が発生したことを示す値が1つだけあります。障害応答は次のようになります。

<?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を示すために、Javaを使用してXML-RPCメッセージを処理するサーバーを作成し、そのサーバー上のプロシージャを呼び出すJavaクライアントを作成します。

会話のJava側では、ApacheXMLプロジェクトのApacheXML-RPCを使用します。 http://xml.apache.org/xmlrpc/

すべての.jarファイルを適切なパスに配置し、JAVAを使用して1つのクライアントと1つの小さなXML-RPCサーバーを作成しましょう。

XML-RPCクライアント

sum関数と呼ばれる関数を呼び出す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など)のクラスが含まれています。

  • Vectorクラスにはパッケージjava.utilが必要です。

  • 関数server.execute(...)は、サーバーに要求を送信します。プロシージャsum(17,13)は、ローカルプロシージャであるかのようにサーバー上で呼び出されます。プロシージャコールの戻り値は常にオブジェクトです。

  • ここで、「サンプル」はサーバーで定義されているハンドラーを示します。

  • プロシージャコールのすべてのパラメータは常にVectorに収集されることに注意してください。

  • XmlRpcClientクラスは、サーバーマシンの「Webアドレス」に続いて/ RPC2を指定することによって構築されます。

    • 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クライアントとサーバーが情報を交換するためにどのように機能するかを示す1つの例を示しました。

XML-RPCは非常に単純な概念であり、機能のセットが限られています。これらの制限は、プロトコルの実装とその相互運用性のテストの難しさを大幅に軽減するため、多くの点でXML-RPCの最も魅力的な機能です。

XML-RPCは単純ですが、単純なツールの創造的なアプリケーションは、洗練された強力なアーキテクチャを作成できます。多種多様な異なるシステムが通信する必要がある場合、XML-RPCが最も適切な最小公分母である可能性があります。

次は何ですか?

次のステップは、WSDLとSOAPを学ぶことです。

WSDL

WSDLは、Webサービスとそのアクセス方法を記述するためのXMLベースの言語です。

WSDLは、Webサービスのメッセージ形式とプロトコルの詳細とともに、Webサービスを記述します。

WSDLについて詳しく知りたい場合は、WSDLチュートリアルをご覧ください。

石鹸

SOAPは、アプリケーションがHTTPを介して情報を交換できるようにする単純なXMLベースのプロトコルです。

SOAPについて詳しく知りたい場合は、SOAPチュートリアルをご覧ください。