XML-RPC PHP Webサービスの作成
XML-RPCサーバコード
RPCの場合、WSDLファイルを作成する必要はありません。サーバの作成と実行するメソッド(呼び出し)の登録のみ必要です。
$server = xmlrpc_server_create();
xmlrpc_server_register_method($server, 'math.add', array('Math', 'add'));
このケースでは、「add」メソッドを実行する「Math」オブジェクトが呼び出されます。
<?php
/**
* Math methods
*/
class Math
{
/**
* Return the sum of all values in an array
*
* @param array $values An array of values to sum
* @return int
*/
public static function add($method, $params)
{
return array_sum($params[0]);
}
}
$server = xmlrpc_server_create();
xmlrpc_server_register_method($server, 'math.add', array('Math', 'add'));
$request = file_get_contents('php://input');
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
echo $response;
?>
XML-RPCクライアントコード
RPCクライアントは、呼び出しが行われる前にリクエストコンテキストを作成する必要があるために、SOAPクライアントよりは多少多くの働きをします。
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request
)));
それ以外についてはSOAPクライアントと同様で、レスポンスが処理され、表示されます。
ソース全体を次に示します。
<?php
try
{
$requestArr = array(1,2);
$request = xmlrpc_encode_request('math.add',array($requestArr),array('encoding' => 'UTF-8'));
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request
)));
$file = file_get_contents('http://localhost/xmlrpc-server.php', false, $context);
if(!$file) {
throw new Exception('Unable to get response from web service');
}
$response = xmlrpc_decode($file);
echo 'XML RPC Example - adding array on the server<br>';
echo $requestArr[0] . ' + ' . $requestArr[1] . ' = ' . $response;
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
SOAPクライアントと同様、このクライアントも1 + 2 = 3を表示します。このクライアントにはSOAPクライアントより多くのエラー処理が含まれていますが、これは意図的なものです。
| メソッド | 説明 |
| SoapServer->__construct( mixed wsdl [, array options] ) | SoapServerオブジェクトを作成します。wsdlパラメータは、WSDLのURIを指定します。options配列には、SOAPバージョンなどのSoapServerオプションを指定できます |
| SoapServer->addFunction( mixed functions ) | SOAPリクエストを処理する1つまたは複数のPHP関数を追加します。単一の関数を文字列として追加できます。複数の関数を配列として追加できます |
| SoapServer->fault() | エラーを示すSoapServerフォールト |
| SoapServer->getFunctions() | 関数のリストを返します |
| SoapServer->handle() | SOAPリクエストを処理し、要求された関数を呼び出し、レスポンスを送り返します |
| SoapServer->setClass(string class_name [, mixed args [, mixed ...]] ) | SOAPリクエストを処理するクラスを設定します。指定されたクラスからすべてのメソッドをエクスポートします。argsは、既定のクラスコンストラクタによって使用されます |
| SoapHeader->__construct() | SOAPヘッダーを作成します |
| SoapClient->__soapCall( string function_name, array arguments [, array options [, mixed input_headers [, array &output_headers]]] ) | SOAP関数を呼び出します |
| SoapClient->__doRequest() | SOAPリクエストを実行します |
| SoapClient->__getFunctions() | SOAP関数のリストを返します |
| SoapClient->__getTypes() | SOAPタイプのリストを返します |
まとめ
本稿では、PHPでWebサービスを作成および利用する2つの標準的な方法について説明しました。また、PHP WS開発用に設計された各種のサードパーティモジュールについても述べました。うれしいことにPHPは最新のすべての標準(W3C SOAP仕様など)をサポートしており、Web開発の世界におけるこの言語の有用性と価値を回復させる結果になっています。
参考資料
- 『PHP - Wikipedia』
- 『PHP: Hypertext Preprocessor』
- 『Browse NuSOAP - SOAP Toolkit for PHP Files on SourceForge.net』
- 『XML-RPC Home Page』
- 『Browse XML-RPC for PHP Files on SourceForge.net』
- 『Enterprise Java Contract-First vs. Contract-Last Web Services』
- 『PHP Web Application Server - PHP Developer tools - PHP Training & Certification - Zend.com』
