// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

このWikiを更新したときに、自動的にPingサーバにPingを打ってくれるプログラムを書きたくて、XML-RPCをちょっと調べてみました。XML-RPCとはHTTP経由でXMLをやりとりして、リモートプロシージャコールを実現するモノみたいです。

JavaでXML-RPCを使うには、[[Apache XML-RPC:http://ws.apache.org/xmlrpc/]]を使うのがよいようです。これを使うことで、めんどくさいXMLを組み立てることなしに、サーバ側のプログラムを呼び出すことができます。楽です。

今回サンプルを書いてみましたが、以下のモジュールをダウンロードしました。
-commons-codec-1.3.tar.gz
-xmlrpc-current.tar.gz


***用語 [#qbb0916c]
:エンドポイント|クライアントのリクエストを受け付けるURLです。たとえばココログのPingサーバのエンドポイントはhttp://ping.cocolog-nifty.com/xmlrpcです。

:メソッド名|エンドポイントに定義されたメソッド名です。エンドポイントとメソッド名でサービスはUniqueになります。ココログにPingうつときのメソッド名はweblogUpdates.pingです。

あるサーバのサービス(リモートプロシージャコール)を呼び出すには、
-エンドポイントを指定して
-(パラメタと一緒に)メソッド名を呼び出す

てかんじですね。サンプルは以下のようになります。

***サンプル [#o1b3cdef]

 package nu.mine.kino.servlets.ping;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Vector;
 
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpc;
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpcException;
 
 /**
  * PingサーバにweblogUpdates.pingを打つクライアントです。
  * 
  * @author Masatomi KINO
  * @version $Revision: 1.2 $
  */
 public class PingClient {
   /**
    * Logger for this class
    */
   private static final Logger logger = Logger.getLogger(PingClient.class);
 
   String endpointURL = "http://localhost:8080/PingWeb/PingReceiver";
 
   //    String endpointURL = "http://ping.cocolog-nifty.com/xmlrpc";
 
   /**
    * PingサーバにPingを打ちます。
    * 
    * @param weblogname
    *      Blogの名前
    * @param weblogurl
    *      BlogのURL
    */
   public void doPing(String weblogname, String weblogurl) {
     logger.debug("doPing(String, String) - start");
 
     Vector parameterList = new Vector();
     parameterList.addElement(weblogname);
     parameterList.addElement(weblogurl);
 
     try {
       XmlRpcClient client = null;
       XmlRpc.setEncoding("UTF-8");
       client = new XmlRpcClient(endpointURL);
 
       //さっきのエンドポイントの、weblogUpdates.ping というメソッド
       //をコールする。パラメタはVectorに格納。
       Hashtable response = (Hashtable) client.execute(
           "weblogUpdates.ping", parameterList);
       if (response == null) {
         System.out.println("No Result Back from execute");
       } else {
         Enumeration e = response.keys();
 
         while (e.hasMoreElements()) {
           Object key = e.nextElement();
           System.out.println("KEY=" + key + " : VALUE="
               + response.get(key));
         }
       }
     } catch (MalformedURLException e1) {
       logger.error("doPing(String, String)", e1);
     } catch (XmlRpcException e) {
       logger.error("doPing(String, String)", e);
     } catch (IOException e) {
       logger.error("doPing(String, String)", e);
     }
 
     logger.debug("doPing(String, String) - end");
   }
 
   public static void main(String[] args) {
     BasicConfigurator.configure();
     PingClient client = new PingClient();
     client.doPing("なまえ", "URL");
 
   }
 
 }

これだけで簡単にサーバのサービスを呼び出すことができます。SOAPとかと比較してみると、確かに単純です。でもWSDLみたいなI/Fを定義するやり方、つまりサービスがどのようなIN/OUTを持ってるかってのはどこで定義するんでしょうか。I/F仕様書を見なさいって事でしょうか??

ちなみに、実際に
 client.doPing("きのさいと", "http://www.masatom.in/pukiwiki/");
と投げてみたところ、以下のhttpリクエストがPOSTされました。

 <?xml version="1.0"?>
 <methodCall>
   <methodName>weblogUpdates.ping</methodName>
   <params>
     <param><value>&#12365;&#12398;&#12373;&#12356;&#12392;</value></param>
     <param><value>http://www.masatom.in/pukiwiki/</value></param>
   </params>
 </methodCall>




***リンク集 [#v8402226]
-[[XML-RPC仕様書:http://lowlife.jp/yasusii/stories/9.html]]
-[[weblogUpdates.pingのI/F仕様:http://www.xmlrpc.com/weblogsCom]]
-[[weblogの更新通知 PingサービスをJava Servletで実装:http://www.goodpic.com/mt/archives/000101.html]]
-[[ブログ情報伝達を加速するトラックバック、ping (2/5):http://www.itmedia.co.jp/enterprise/articles/0507/20/news007_2.html]]
-[[第1作目(04/08/02) 「Rss Ping」アプリケーション:http://funyami.pya.jp/java/development_history.html]]
-[[Weblogs.com Ping Gateway to はてなアンテナ:http://blog.bulknews.net/cookbook/blosxom/pings/ping_to_hatena.html]]
-[[Apache XML-RPCプログラミング:http://kumiki.c.u-tokyo.ac.jp/~ichiyama/cgi-bin/hiki/Apache+XML-RPC%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0.html]]


----
この記事は
#vote(おもしろかった[5],そうでもない[1])
#vote(おもしろかった[6],そうでもない[1])


#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS