FC2のブログ投稿にXML-RPCを使ってみる

XML-RPCって大分古い技術なはずだよなぁ。
RPCってリモートプロシージャコール。
プロシージャってWinアプリを作るときにウィンドウプロシージャーってときに使って以来、
理解をずーと先送りにしていたのだけれども、
ようやく理解しなきゃいけないのかなっと。




理解した部分で言うところの、
XML-RPCをざーというと、
XMLでリクエストを送信して、処理して、レスポンスをXMLでもらう。
処理用の対話をXMLでやるってことだわね。
やりとりがXMLなのでXML
そのやり取りで処理してもらうのをRPC。
あわせて、XML-RPCだと思う。


XML-RPCはいろいろに使えるんでしょうけど、ブログの更新が標準化されているのかなと。
調べると主にMovableTypeが使っているようだ。



今回はFC2にバッチでブログを投稿したかったので、
APIないのかなぁ と思ったり、
HTTPリクエストを生成してやればいいなぁ と思ったりしたが、
調べるとFC2はXML-RPCに対応している と書いてあった…というより、
書いている人はいた、けど公式にはどこに書いてあるの分からなかったw




ググるPHPの例はいっぱいでてくるけどなぁ。
なので今回はJAVAでアドリブで実装してみた。





今回使用するXML-RPCのライブラリは

<dependency>
	<groupId>ws-common-util</groupId>
	<artifactId>ws-common-util</artifactId>
	<version>1.0.2</version>
</dependency>
<dependency>
	<groupId>org.apache.xmlrpc</groupId>
	<artifactId>xmlrpc-common</artifactId>
	<version>3.1.3</version>
</dependency>
<dependency>
	<groupId>org.apache.xmlrpc.client</groupId>
	<artifactId>xmlrpc-client</artifactId>
	<version>3.1.3</version>
</dependency>

この辺。
ただ、xmlrpc-clientに3.1.3がSeaserMavenサイトにも、MavenMavenサイトにもない…。
ので、独自のMavenサイトにインストールしておく。
2.x系はあるのだけれども、今この状況でXML-RPCをProxyの中から送信したかったので、
apacheXML-RPCのプロクシ対応は3.1.3からってどっかに書いてあった。


いきなりJAVAでのコードを書いてしまうと、

private static final Proxy PROXY;
static {
	SocketAddress sa = new InetSocketAddress( PROXY_SERVER, PROXY_PORT );
	PROXY = new Proxy( Proxy.Type.HTTP, sa );
}

private Object executeXmlRpc( String endpointURL, String method, List<Object> parameterList ) {
	try {
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		config.setEncoding("UTF-8");
		config.setServerURL( new URL( endpointURL ) );

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

		XmlRpcSun15HttpTransport t = new XmlRpcSun15HttpTransport( client );
		t.setProxy( PROXY );

		XmlRpcRequest r = new XmlRpcClientRequestImpl( config, method, parameterList );

		return t.sendRequest( r );
	} catch ( XmlRpcException e ) {
		logger.debug( e );
	} catch ( MalformedURLException e ) {
		logger.debug( e );
		e.printStackTrace();
	}
	return null;
}

これでOKだった。
methodは、

"metaWeblog.getRecentPosts"
"metaWeblog.newPost"
"mt.setPostCategories"
"mt.getCategoryList"

今回はこんなのを使用。

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();

これはXmlRpcClientConfigのインターフェースでいい気もするんだけど、
setEncodeingとsetServerURLとかがなくて、
探したところImplを直接使うでいいのかなぁと。

XmlRpcSun15HttpTransport t = new XmlRpcSun15HttpTransport( client )

XmlRpcSun15HttpTransportじゃないないと、Proxyのセットがないという。


最終的に一番重要なのが送信するパラメータだと思う。
今回は、Listにした。

org.apache.xmlrpc.client.XmlRpcClientRequestImpl.XmlRpcClientRequestImpl(XmlRpcRequestConfig pConfig, String pMethodName, List pParams)

パラメーターがListなので、Java1.4の頃の技術なのかな…。
なので、型パラメータは何でもいいんでしょうけど。


たいてい、パラメータのパタンがListかStructになっているので、
ListかHashtableかで対応すれば問題なし。
(HashtableじゃなくてMapでも良かったかも)


Listのもの場合、

List<Object> parameterList = new ArrayList<Object>();
parameterList.add( BLOG_ID );
parameterList.add( FC2_USERNAME );
parameterList.add( FC2_PASSWORD );


Structがある場合、

Hashtable param = new Hashtable();

param.put( "title", title );
param.put( "description", blog );

List<Object> parameterList = new ArrayList<Object>();
parameterList.add( BLOG_ID );
parameterList.add( FC2_USERNAME );
parameterList.add( FC2_PASSWORD );
parameterList.add( param );
parameterList.add( "1" );


こーんな感じでいけました とさ。


しかしなんか、せっかくSeaser使ってんだし、
DIしたいもんだなぁ。


あとで考えてみよう。