XML-RPCは、呼び出しをエンコードするためにXMLを使用し、トランスポートメカニズムとしてHTTPを使用するリモートプロシージャコール(RPC)プロトコルです。 [ 1 ]
XML-RPCプロトコルは、UserLand SoftwareとMicrosoftのDave Winerによって1998年に作成されました。[ 2 ] Microsoftは、このプロトコルがB2B電子商取引の取り組みを拡大する上で不可欠な要素であると見ていました。[ 3 ]新しい機能が導入されるにつれて、この標準は現在のSOAPへと進化しました。[ 4 ]
UserLandは、1998年6月にリリースされたFrontierウェブコンテンツ管理システムのバージョン5.1からXML-RPCをサポートしました。[ 4 ] [ 5 ]
XML-RPCの、人間が読み書きでき、スクリプト解析可能なHTTPベースのリクエストとレスポンスの標準という考え方自体は、AllaireのWeb Distributed Data Exchange(WDDX)やwebMethodのWeb Interface Definition Language(WIDL)などの競合仕様にも実装されている。[ 6 ] COM、CORBA、Java RMIオブジェクトをXML構文でラップし、HTTP経由で転送する先行技術は、DataChannelのWebBroker技術にも存在していた。 [ 7 ] [ 8 ]
XMLのリモートプロシージャコール(RPC)における汎用的な使用法は、フィリップ・メリック、スチュワート・アレン、ジョセフ・ラップによって2006年4月に特許取得され、1998年3月に提出された仮出願の利益を主張した。この特許は、バージニア州フェアファックスに所在するwebMethods社に譲渡された。この特許は2019年3月23日に失効した。[ 9 ]
XML-RPCでは、クライアントはXML-RPCを実装したサーバーにHTTPリクエストを送信し、HTTPレスポンスを受信することでRPCを実行します。呼び出しは複数のパラメータと1つの結果を持つことができます。プロトコルは、パラメータと結果に対していくつかのデータ型を定義しています。これらのデータ型の中には複雑なもの、つまりネストされたものもあります。例えば、5つの整数からなる配列をパラメータとして持つことができます。
パラメータ/結果構造とデータ型のセットは、一般的なプログラミング言語で使用されるものを反映することを目的としています。
認可のためのクライアント識別は、一般的なHTTPセキュリティ方式を使用して実現できます。識別と認証には、基本アクセス認証を使用できます。
リソース表現(ドキュメント)を転送するRESTfulプロトコルと比較すると、XML-RPCはメソッドを呼び出すように設計されています。実質的な違いは、XML-RPCの方がはるかに構造化されているため、共通のライブラリコードを使用してクライアントとサーバーを実装でき、特定のアプリケーションプロトコルの設計とドキュメント化の作業が少なくなるという点です。一般的なRESTfulプロトコルとXML-RPCの顕著な技術的な違いは、多くのRESTfulプロトコルがパラメータ情報にHTTP URIを使用するのに対し、XML-RPCではURIはサーバーの識別のみに使われることです。
JSON-RPCは XML-RPC に似ています。
一般的なデータ型は、以下に示す例の値を使用して、同等の XML に変換されます。
| 名前 | タグの例 | 説明 | |
|---|---|---|---|
| 配列 | <array> <data> <value><i4> 1404 </i4></value> <value><string>ここに何か</string></value> <value><i4> 1 </i4></value> </data> </array> | キーを保存しない値の 配列 | |
| ベース64 | <base64> eW91IGNhbid0IHJlYWQgdGhpcyE= </base64> | Base64でエンコードされたバイナリデータ | |
| ブール値 | <ブール値> 1 </ブール値> | ブール論理値(0または1) | |
| 日付/時刻 | <dateTime.iso8601> 19980717T14:08:55Z </dateTime.iso8601> | ISO 8601形式 の日付と時刻 | |
| ダブル | <double> -12.53 </double> | 倍精度浮動小数点数 | |
| 整数 | <int> 42 </int>または <i4> 42 </i4> | 4バイトで 符号化された符号付き整数 | |
| 弦 | <文字列>こんにちは世界!</文字列>または こんにちは世界! | 文字列。XMLエンコードに従う必要があります。 | |
| 構造体 | <構造体> <メンバー> <名前> foo </名前> <値><i4> 1 </i4></値> </メンバー> <メンバー> <名前> bar < /名前> <値><i4> 2 </i4></値> </メンバー> </構造体> | 連想配列 | |
| ゼロ | <nil/> | 判別されたヌル値; XML-RPC拡張 | |
| 長さ | <i8> 1312 </i8> | 8バイトで符号化された符号付き整数。これは仕様の一部ではないが、いくつかのXML-RPC実装でサポートされている[ 10 ] · [ 11 ]。 |
典型的な XML-RPC リクエストの例は次のようになります。
<?xml version="1.0"?> <methodCall> <methodName> examples.getStateName </methodName> <params> <param> <value><i4> 40 </i4></value> </param> </params> </methodCall>典型的な XML-RPC 応答の例は次のようになります。
<?xml version="1.0"?> <methodResponse> <params> <param> <value><string>サウスダコタ</string> </value> </param> </params> </methodResponse>典型的な XML-RPC 障害は次のようになります。
<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name> faultCode </name> <value><int> 4 </int></value> </member> <member> <name> faultString </name> <value><string>パラメータが多すぎます。 </string></value> </member> </struct> </value> </fault> </methodResponse>XML-RPCに対する最近の批判者(2010年以降)は、RPC呼び出しはプレーンXMLでも実行可能であり、XML-RPCはXMLに何の価値も追加しないと主張しています。XML-RPCとXMLはどちらも、XMLスキーマで定義されているフィールド名やXML-RPCのパラメータ名など、アプリケーションレベルのデータモデルを必要とします。さらに、XML-RPCは同じオブジェクトをエンコードするのにプレーンXMLの約4倍のバイト数を使用し、それ自体がJSONと比較して冗長です。[ 12 ] [ 13 ] [ 14 ]