Hatena::ブログ(Diary)

何言語でも話したいPGの開発日記

※「2010年12月25日

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

| 04:30

XML-RPCって大分古い技術なはずだよなぁ。

RPCってリモートプロシージャコール。

プロシージャってWinアプリを作るときにウィンドウプロシージャーってときに使って以来、

理解をずーと先送りにしていたのだけれども、

ようやく理解しなきゃいけないのかなっと。




理解した部分で言うところの、

XML-RPCをざーというと、

XMLでリクエストを送信して、処理して、レスポンスをXMLでもらう。

処理用の対話をXMLでやるってことだわね。

やりとりがXMLなのでXML

そのやり取りで処理してもらうのをRPC

あわせて、XML-RPCだと思う。


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

調べると主にMovableTypeが使っているようだ。



今回はFC2にバッチでブログを投稿したかったので、

APIないのかなぁ と思ったり、

HTTPリクエストを生成してやればいいなぁ と思ったりしたが、

調べるとFC2XML-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-RPCProxyの中から送信したかったので、

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<Object>にした。

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したいもんだなぁ。


あとで考えてみよう。

トラックバック - http://d.hatena.ne.jp/akubito/20101225/1293305421