PHPを用いたXML-RPCの基礎

宮崎 真, 廣安 知之, 三木 光範

ISDL Report  No. 20050813007

2005年 9月 19日

Abstract

XML-RPCとはHTTP上でリモート手続き呼び出しを行うための方法であり,操作方法が とても容易である.XMLデータを送信することにより,その結果がXMLとして返ってくる, というシンプルな仕組みとなっている.
本報告では,PHPを用いXML-RPCの概要および簡単な利用例を紹介する.

1  はじめに

XML-RPCとはHTTP上でリモート手続き呼び出しを行うための方法であり,操作方法が とても容易である. XML-RPCではXMLデータを送信することにより,その結果がXMLとして返ってくる, というシンプルな仕組みとなっており, Perl,Java,Python,C,C++,PHPや多くの他のプログラミングで利用できる. XML-RPCと同じ仕組みを持つものとしとしてはSOAPが有名だが,XML-RPCの方がXMLの構造的に非常にシンプルになって おり,XMLを書くためのモジュールが多く用意されていることから, 直接XMLを書かずに簡単にプログラムを書くことができる.
 本報告では,PHPを用いXML-RPCの簡単な利用例を紹介する.

2  XML-RPC

XML-RPCではHTTP上でリモート手続き呼び出しを行うため, クライアント・サーバモデルとなる.その構造をFig.1に示す.

Fig.1: XML-RPC
( 出典:参考[1] )

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でサポートされるデータの種別は以下の通りである.

3  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.2: 実行結果

続いて,このページのソースを以下Fig.3に示す.

Fig.3: 実行結果(HTMLソース)

4  XML-RPC API

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に示す.

Fig.4: 実行結果(Movable Type API)

この例ではメソッドとして「blogger.getUsersBlogs」を利用しており, appkey(Movabletypeでは関係無く任意の文字列でよい),username(MTのユーザ名), password(MTのパスワード)を引数として,url(トップページのURL),blogid(weblogのblogid), blogname(weblogの名前)を返す.この他にも多くのメソッドが用意されており, これを用いることで独自のブログ投稿システム等を実装することが可能である.

5  まとめ

本報告では,XML-RPCについて説明し,簡単な実装例を紹介した. 通信にXMLを利用することから,異なるプログラム言語間でも オブジェクト的にメソッドが利用できる.
 また,Movable Type等でも多くのAPIが準備されていることから, これからもAPIのサポートが増えるであろう. そして,このWeb上に存在するXML-RPC APIを連携させることで 様々なサービスが考えられる.

References

[1]
Java&XML
http://www.oreilly.de/artikel/xml_einf.html
[2]
PHPとPEARでXML-RPC
http://www.s-m-l.org/dev/php_xml_rpc.html
[3]
XML-RPC HOWTO
http://www.linux.or.jp/JF/JFdocs/XML-RPC-HOWTO/index.html
[4]
XML-RPC 仕様書
http://lowlife.jp/yasusii/stories/9.html
[5]
Movable Type で使える XML-RPC API書
http://lowlife.jp/yasusii/stories/9.html
[6]
drifting blog
http://bloggers.ja.bz/sunouchi/archives/cat_movable_type_xml-rpc.php

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.


Back to Top