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");
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が返ってくるとかのが使いやすそう。
おわり。
参考
- http://xmlrpc.scripting.com/
- https://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/client/XmlRpcClient.html
- https://ws.apache.org/xmlrpc/types.html