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がSeaserのMavenサイトにも、MavenのMavenサイトにもない…。
ので、独自のMavenサイトにインストールしておく。
2.x系はあるのだけれども、今この状況でXML-RPCをProxyの中から送信したかったので、
apacheのXML-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したいもんだなぁ。
あとで考えてみよう。