Top / XML / XML-RPC

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

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

今回サンプルを書いてみましたが、以下のモジュールをダウンロードしました。

  • commons-codec-1.3.tar.gz
  • xmlrpc-current.tar.gz

用語

エンドポイント
クライアントのリクエストを受け付けるURLです。たとえばココログのPingサーバのエンドポイントはhttp://ping.cocolog-nifty.com/xmlrpcです。
メソッド名
エンドポイントに定義されたメソッド名です。エンドポイントとメソッド名でサービスはUniqueになります。ココログにPingうつときのメソッド名はweblogUpdates.pingです。

あるサーバのサービス(リモートプロシージャコール)を呼び出すには、

  • エンドポイントを指定して
  • (パラメタと一緒に)メソッド名を呼び出す

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

サンプル

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>

リンク集


この記事は

選択肢 投票
おもしろかった 6  
そうでもない 1  

Top / XML / XML-RPC

現在のアクセス:17521


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-03-21 (木) 10:45:57 (4047d)