XML-RPCのclient側をJavaで触ってみたのでメモしておく。

XML-RPCとは

XML-RPCはサーバとやり取りするデータのフォーマットにXMLを使うRPC(remote procedure call)で、コレに機能を追加したものがSOAPらしい。

詳しくは http://xmlrpc.scripting.com/ を参照。

dependency

ApacheのXML RPCクライアントがあるのでそれを使う。

2010/02が最後の更新。

<dependency>
<groupId>org.apache.xmlrpc</groupId>
<artifactId>xmlrpc-client</artifactId>
<version>3.1.3</version>
</dependency>

JavaDoc

APIを実行してみる

XML-RPCはmethod名とパラメータを指定し実行する。

XML-RPCの仕様書にmethod名とパラメータが書かれているはずなのでそれを以下の様に指定すると実行できる。

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setEncoding("UTF-8");
// set endpoint
config.setServerURL(new URL("http://example.com/xmlrpc"));

XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);

Object response = client.execute("someMethodName", Arrays.asList(someParam1, someParam2));

エンドポイントのURLを指定して、メソッド名とパラメータを入力してexecuteすると実行できる。

パラメータ名を指定したい場合は次の様にMapで渡せばOK。

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setEncoding("UTF-8");
config.setServerURL(new URL(endpointURL));

XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
Map<String, String> params = new HashMap<String, String>() {
{
put("paramName1", "someParam1");
put("paramName2", "someParam2");
}
};
Object response = client.execute("someMethodName", new Object[] {params});

実行すると次の様なXMLが生成されサーバに送られる。

<?xml version="1.0"?>
<methodCall>
<methodName>someMethodName</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>paramName1</name>
<value><string>someParam1</string></value>
</member>
<member>
<name>paramName2</name>
<value><string>someParam2</string></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

XML-RPCの型

XML-RPCの値は型が指定されており、Javaでは次の様な型にマッピングされる。

XML RPC tag Java type
string String
int, i4 Integer
double Double
boolean Boolean
base64 byte[]
dateTime.iso8601 Date
struct Map
array Object[]

レスポンス

レスポンスはxml-rpcクライアントが対応する型に変換してObjectとして得られる。
例えば、次のようなデータ構造でJavaのObjectに変換されて返ってくる。

HashMap{
StatusCode=String,
Result=HashMap{
UserName=String,
Age=String,
Page=Object[
HashMap{Title=String, Url=String},
HashMap{Title=String, Url=String}
]
}
}

例えば、Page[0]のTitleを取る場合は、

String title = (String)((HashMap)((Object[])((HashMap)(((HashMap)response).get("Result")).get("Page"))[0]).get("Title"))

すごく取り出しにくい・・・です・・・。
XPATHで要素を指定するとObjectが返ってくるとかのが使いやすそう。

おわり。

参考

  1. http://xmlrpc.scripting.com/
  2. https://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/client/XmlRpcClient.html
  3. https://ws.apache.org/xmlrpc/types.html