これは、XML-RPC サーバのクライアントを表現するために使用されます。
コンストラクタは以下のような構文です。
$client = new XML_RPC_Client (string $path, string $server [, integer $port [, string $proxy [, integer $proxy_port [, string $proxy_user [, string $proxy_pass]]]]])
$pathリクエストを送信したい RPC サーバスクリプトのパスと名前。
$server接続先リモートサーバの URL 。プロトコルが指定されておらず、 かつ $port が 443 であった場合は ssl:// が使用されます。
$portリモートサーバに接続する際のポート。デフォルトは 80 で、 http:// 接続を表します。443 を指定すると https:// および ssl:// 接続となります。
$proxyもし使用するなら、プロキシサーバの URL 。 プロトコルが指定されておらず、 かつ $port が 443 であった場合は ssl:// が使用されます。
$proxy_portリモートサーバに接続する際のポート。デフォルトは 8080 で、 http:// 接続を表します。443 を指定すると https:// および ssl:// 接続となります。
$proxy_userプロキシサーバにアクセスするためのユーザ名。
$proxy_passプロキシサーバにアクセスするためのパスワード。
注意 SSL 接続を使用するには、 openssl 拡張モジュールを有効にして PHP がインストールされている必要があります。
betty.userland.com にある Userland の XML-RPC サーバに問い合わせるためのクライアント設定の例は このようになります。
|
このクラスは以下のメソッドをサポートしています。
このメソッドは以下のような書式です。
$xmlrpc_message は
XML_RPC_Message のインスタンスで、
$response は
XML_RPC_Response のインスタンスです(XML_RPC_Response
を参照ください)。
$timeout はオプションで、指定しなかった場合は
0(永遠に待ち続ける)となります。この値は
fsockopen() に渡されます。
もし $response の内容が
XML_RPC_Response ではなく
0 であった場合、それは I/O エラーが発生したことを
表します。発生した I/O エラーの内容については、
$client->errno および
$client->errstring の値から知ることができます。
低レベルのエラーに加え、問い合わせ先の XML-RPC サーバが XML_RPC_Response オブジェクトの中でエラーを 返すこともあります。これらのエラーを処理する方法については XML_RPC_Response を参照ください。
このメソッドは、クライアントがサーバに対する認証処理を行う際の ユーザ名とパスワードを指定します。デフォルトの通信(HTTP)では、 これらの情報が HTTP ベーシック認証に使用されます。
このクラスは XML-RPC サーバへのリクエストを表します。クライアントは XML_RPC_Message をサーバに送信し、 XML_RPC_Response を受け取ります。
コンストラクタは以下のような構文です。
$methodName は起動したいメソッドの名前で、
$parameterArray は
XML_RPC_Value オブジェクトの配列です。
US state name サーバにメッセージを送信する例です。
|
この例では州番号 23 の州の名前を問い合わせています。 XML_RPC_Value オブジェクトについての 詳細な情報は XML_RPC_Value を参照ください。
このクラスは、XML-RPC リクエストに対する応答を格納するために使用されます。 サーバのメソッドハンドラは XML_RPC_Response を 作成し、返り値としてそれを渡します。 XML_RPC_Client クラスの send() メソッドを実行した際に、これと同じ値が返されます。
ひとつめのインスタンスは、何の問題もなく処理が実行された際に使用されます。
$xmlrpcval は
XML_RPC_Value の値で、メソッドの実行結果が
格納されています。
2 番目の形式のコンストラクタは、失敗時に使用されます。どこに問題が
あったのかを示すために、$errcode および
$errstring が使用されます。渡されるエラーコードの
詳細については XML_RPC_Server を参照ください。
これは、多くの大変な仕事を担当するものです。このクラスは、XML-RPC で使用する値の作成とカプセル化を可能にします。
事前に http://www.xmlrpc.com/stories/storyReader$7 で XML-RPC の仕様を読んでおくと、これ以降の内容を理解しやすくなるでしょう。
XML_RPC_Value クラスは、以下の型を利用して 任意の複雑な値を格納することが可能です。 i4、 int、 boolean、 string、 double、 dateTime.iso8601、 base64、 array あるいは struct。 これらの型についての詳細な情報は 仕様 を参照ください。
この型を使用すると、Base64 エンコーディングが透過的に行われます。 そのため、これはバイナリデータ型として扱うべきで、7 ビットクリーン ではないデータを渡したい場合に使用します。デコード処理もまた 透過的に行われます。
<、 >、 " および & の各文字は、 XML-RPC での通信の際に各々と等価なエンティティ <、 >、 " および & に変換されます。現在の XML-RPC の仕様では エンコードするよう推奨されているのは < および & だけですが、この実装ではさらに一歩先を行っています。 その理由は XML 1.0 勧告 で説明されています。
TODO: ' エンティティは現在サポートされていません。
コンストラクタは、XML_RPC_Value を生成するための一般的な方法です。コンストラクタは以下のような構文です。
$myVal = new XML_RPC_Value ()
$myVal = new XML_RPC_Value ($stringVal)
$myVal = new XML_RPC_Value ($scalarVal, 'int' | 'boolean' | 'string' | 'double' | 'dateTime.iso8601' | 'base64')
$myVal = new XML_RPC_Value ($arrayVal, 'array' | 'struct')
最初のコンストラクタは空の値を生成します。使用する前に、必ず addScalar()、 addArray() あるいは addStruct() で初期化しなければなりません。
2 番目のコンストラクタはシンプルな文字列値を生成します。
3 番目のコンストラクタはスカラ値を生成するために使用されます。 第 2 パラメータは、以下の例のように XML-RPC 型の名前である必要があります。
|
4 番目の形式のコンストラクタは、複雑な XML-RPC の値を作成するのに 使用されます。値が XML-RPC の 配列 である場合は 単純な配列、構造体 の場合は連想配列を 第 1 パラメータに指定します。配列の要素は XML_RPC_Value オブジェクトである必要があります 。例えば以下のようになります。
$myArray = new XML_RPC_Value(array(
new XML_RPC_Value("Tom"), new XML_RPC_Value("Dick"),
new XML_RPC_Value("Harry")), "array");
$myStruct = new XML_RPC_Value(array(
"name" => new XML_RPC_Value("Tom"),
"age" => new XML_RPC_Value(34, "int"),
"geek" => new XML_RPC_Value(1, "boolean")), "struct"); |
$ok = $val->addScalar ($stringVal)
$ok = $val->addScalar ($scalarVal, 'int' | 'boolean' | 'string' | 'double' | 'dateTime.iso8601' | 'base64')
$val が空の
XML_RPC_Value だった場合、このメソッドは
そこにスカラ値を設定します。すでに $val に
スカラ値が設定されていた場合、新たにスカラ値が追加されることはなく
0 が返されます。すべての処理がうまく終了した場合は
1 が返されます。
$val が 配列
だった場合は特別で、スカラ値が配列に追加されます。
このクラスの現在の実装は、できる限りシンプルであることを心がけています。 基本的には、コンストラクタがすべての仕事をこなします。最低限の例は 以下のとおりです。
|
これは、サーバで実行させたい仕事をすべて行ってくれます。たったひとつの 引数は連想配列であり、メソッド名と関数名を対応させます。リクエストが 解析されると適切な関数が呼び出され、関数が返す XML_RPC_Response オブジェクトはシリアライズされて コール元に返されます。
ハンドラ関数 foo() が何を行うのかについて、 もうすこし詳しく見てみましょう。
|
XML_RPC_Server() コンストラクタの最初の引数は配列で、 ディスパッチマップと呼ばれます。この配列の中にあるのは、 あなたが定義した XML-RPC メソッドを提供するために必要な情報です。
ディスパッチマップは、連想配列の連想配列という形式になります。 外側の配列は個々のメソッドに対してひとつのエントリを持ち、 メソッド名が連想配列のキーとなります。キーに対応する値は別の連想配列で、 以下のようなメンバを保持します。
function - このエントリは必須です。
XML-RPC メソッドを提供するために使用するグローバルスコープの関数名である
必要があります。
signature - このエントリは、メソッドがとりうる
シグネチャ(Signatures
を参照ください)を含む配列です。このエントリが存在する場合、
メソッドを割り振る前にサーバ側で引数の数や型のチェックを行います。
docstring - このエントリは、メソッドの
ドキュメントを含む文字列です。ドキュメントには HTML マークアップを
含めることが可能です。
シグネチャとは、メソッドの返り値の型やそのパラメータの型を示すものです。 メソッドは、すくなくともひとつのシグネチャを持っています。
サーバのディスパッチマップ内では、個々のメソッドはとりうるシグネチャの 配列を保持しています。各シグネチャの中身は型の配列で、最初のエントリは 返り値の型です。
例を実行してみましょう。このような普通の PHP 関数を書こうとしている状況を 想定してください。
|
この関数を XML_RPC サーバで動作させようとすると、このように 書く必要があります。
|
これは、とりうる順番のシグネチャをすべて網羅したものです。
|
サーバはこのようにしてインスタンス化します。
|
使いやすさを考慮し、XML-RPC の型を表す文字列がグローバル変数として コード化されています。
|
あなたが作ろうとしているサーバでは、何らかの理由(たとえば セキュリティ認証など)によりリクエストに対する応答をいったん保留したい こともあるでしょう。コンストラクタの 2 番目の引数に 0 を渡すと、お望みの効果が得られます。その後、 サーバクラスの service() メソッドを使用して リクエストを処理すればよいのです。たとえば以下のようになります。
|
サーバが返す失敗コードは、グローバルの $xmlrpcerruser が指す値に 1 を加えた値から開始するべきです。
サーバが返す標準的なエラーには以下のようなものがあります。
サーバが関知しないメソッドの実行を要求された際に返されます。
このエラーは、実際のところサーバやコードではなくクライアント側で 発生します。しかし、これはサーバが自分で理解できない何かを返したことを 示します。
サーバがメソッドに対応したシグネチャを保持しており、クライアントから 渡されたパラメータがいずれのシグネチャにも一致しなかった際に発生します。
このエラーは、組み込みの system.*() メソッドから 発生するもので、サーバ上で未定義のメソッドを実行しようとした際に起こります。
このエラーは、サーバからの応答として HTTP/1.1 200 OK が戻ってこなかった際に クライアント側で発生します。エラーの詳細な情報は、上のメッセージの最後に 付け加えられます。
発生した障害の XML パーサエラーコードに 100 を加えたものを返します。
返される faultString の中には、入力 XML ストリームの
どこでパースエラーが発生したのかが示されています。