// 下階層用テンプレート #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>きのさいと</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(おもしろかった[4],そうでもない[1]) #comment #topicpath SIZE(10){現在のアクセス:&counter;}