XML-RPCとはHTTP上でリモート手続き呼び出しを行うための方法であり,操作方法が
とても容易である.XMLデータを送信することにより,その結果がXMLとして返ってくる,
というシンプルな仕組みとなっている.
本報告では,PHPを用いXML-RPCの概要および簡単な利用例を紹介する.
XML-RPCとはHTTP上でリモート手続き呼び出しを行うための方法であり,操作方法が
とても容易である.
XML-RPCではXMLデータを送信することにより,その結果がXMLとして返ってくる,
というシンプルな仕組みとなっており,
Perl,Java,Python,C,C++,PHPや多くの他のプログラミングで利用できる.
XML-RPCと同じ仕組みを持つものとしとしてはSOAPが有名だが,XML-RPCの方がXMLの構造的に非常にシンプルになって
おり,XMLを書くためのモジュールが多く用意されていることから,
直接XMLを書かずに簡単にプログラムを書くことができる.
本報告では,PHPを用いXML-RPCの簡単な利用例を紹介する.
XML-RPCは通信する上で,XML-RPCの値はXMLにエンコードされる. 以下がその例である.
<methodCall> <methodName>sample.sumAndDifference</methodName> <params> <param><value><int>5</int></value></param> <param><value><int>3</int></value></param> </params> </methodCall>
XML-RPCでサポートされるデータの種別は以下の通りである.
PHPでXML-RPCを利用する場合,PEARパッケージ[
XML_RPC]を
用いることでXMLを直接記述することなく,簡単にブログラムを記述することができる.
また,XML-RPCはサーバ・クライアントモデルであることから両者のプログラムが必要となる.
まず下記にサーバサイドのプログラムを示す.
( 出典:参考[2] )
server.php
<?php require_once("XML/RPC.php"); require_once("XML/RPC/Server.php"); $GLOBALS['XML_RPC_defencoding'] = "UTF-8"; function sum($params) { global $XML_RPC_erruser; // import user errcode value $p1 = $params->getParam(0); $p2 = $params->getParam(1); $v1 = $p1->scalarval(); $v2 = $p2->scalarval(); $value = new XML_RPC_Value($v1+$v2, "int"); return new XML_RPC_Response($value); } //RPCの実行 $s = new XML_RPC_Server(array("sample.sum" => array("function" => "sum"))); ?>
上記のプログラムでは,クライアントから送られてきた二つのint型の数値の足し算を行い, 結果を返すというものである. 続いて,このサーバのメソッドを利用するためのクライアント側のプログラムの例を以下に示す.
client.php
<html>
<head>
<title>XML-RPC(PHP) Client Demo</title>
</head>
<body>
<h1>XML-RPC(PHP) Client Demo</h1>
<?php
require_once("XML/RPC.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";
//クライアントの作成
$xmlrpc_host = "localhost"; //host名
$xmlrpc_path = "/~test/xml_rpc/server.php";//パス
$c = new XML_RPC_client( $xmlrpc_path, $xmlrpc_host, 80 );
//メッセージ作成
$params = array(new XML_RPC_Value( 5, 'int' )
,new XML_RPC_Value( 3, 'int' ));
$message = new XML_RPC_Message('sample.sum',$params);
//メッセージ送信
$response = $c->send($message);
// Process the response.
if (!$response->faultCode()) {
$v = $response->value();
print "Value: ". $v->scalarval() ."<br>";
print "The XML received:<blockquote>" . $response->serialize();
print "</blockquote>";
}else{
print "Fault Code: " . $response->faultCode() . "<br>";
print "Fault Reason: " . $response->faultString() . "<br>";
}
?>
</body>
</html>
実行結果は以下の通りである.
続いて,このページのソースを以下Fig.3に示す.
Web上では,ブログに例を見るようにXML-RPCのサーバーサイドのプログラムがサポートされており,
多くのメソッド群が用意されている.これにより,必要な情報を取り出したり,他のサービス
との連携をとることが可能となる.
ここでは,MovableTypeでサポートされているXML-RPC APIの利用例を挙げる.
(参考:[5],[6])
mt_xml_rpc.php
<?php
require_once("XML/RPC.php"); //XML-RPC package 読み込み
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";
//XML-RPCインタフェース、ユーザ定義
$mt_host = "172.20.11.225";
$mt_xmlrpc_path = "/~sc/sc05/mt-xmlrpc.cgi";
$mt_user = 'Melody';
$passwd ='Nelson';
//クライアントの作成
$c = new XML_RPC_client( $mt_xmlrpc_path, $mt_host, 80 );
$appkey = new XML_RPC_Value( '', 'string' );
$username = new XML_RPC_Value( $mt_user, 'string' );
$passwd = new XML_RPC_Value( $passwd, 'string' );
//メッセージ作成
$message = new XML_RPC_Message(
'blogger.getUsersBlogs',
array($appkey, $username, $passwd) );
//$message = new XML_RPC_Message('mt.supportedMethods');
//メッセージ送信
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit('XML-RPC fault ('.$result->faultCode().'): '
.$result->faultString());
}
$blogs = array_map( 'array_convEnc', XML_RPC_decode( $result->value() ) );
echo "<pre>";
print_r($blogs);
echo "</pre>";
function array_convEnc($a)
{
if( is_array($a) ){ return array_map( 'array_convEnc', $a ); }
return mb_convert_encoding(
$a, mb_internal_encoding(),
$GLOBALS['XML_RPC_defencoding'] );
}
?>
実行結果を以下Fig.4に示す.
この例ではメソッドとして「blogger.getUsersBlogs」を利用しており, appkey(Movabletypeでは関係無く任意の文字列でよい),username(MTのユーザ名), password(MTのパスワード)を引数として,url(トップページのURL),blogid(weblogのblogid), blogname(weblogの名前)を返す.この他にも多くのメソッドが用意されており, これを用いることで独自のブログ投稿システム等を実装することが可能である.
本報告では,XML-RPCについて説明し,簡単な実装例を紹介した.
通信にXMLを利用することから,異なるプログラム言語間でも
オブジェクト的にメソッドが利用できる.
また,Movable Type等でも多くのAPIが準備されていることから,
これからもAPIのサポートが増えるであろう.
そして,このWeb上に存在するXML-RPC APIを連携させることで
様々なサービスが考えられる.
Copyright (C) 2005 Tomoyuki Hiroyasu, All rights reserved. Copyright (C) 2005 Mitsunori Miki, All rights reserved. Copyright (C) 2005 Masashi Miyazaki, All rights reserved. No part of this document may be reproduced, copied, distributed, transferred, modified, or transmitted, in any form or by any means, without the prior written permission of the authors. In no event shall the authors be liable for any damages caused in any way out of the use of this document.