Xml-RPCを使う(クライアント編)

今度xml-rpcのサーバーとクライアントの両方を作る必要が某所であるといわれたので、ちょっと調べてみた。Rubyでデータのやり取りってSoapかDRbかRESTしか使ったことがないんだな<私。

xml-rpcのライブラリはruby1.8からは標準で添付されているので、環境構築は全く問題無い。クライアントから使ってみるのが一番と想ったので、適当なWebサービスxml-rpcインターフェイスを提供しているものを探してみたところFlicker提供していたのでこれで試してみる事にする。

ここのApiを使うには、先にAPIKey申請が必要になるので注意(今回は既に申請済みだった)。

いくつもサービスがあるんだけど、動きを知れば十分なので最近投稿された写真のurlを得るAPI(flickr.photos.getRecent)を使ってみる。

引数で必須なのは"api_key"で後はオプションで1ページ当たりのデータ量と現在のページ等を指定出来る。この辺はxmlを作ってstringを引数にするのかとおもったら、Hash構造を作って渡してやるとうまく引数として送ってくれるみたいなので便利。

テストなのでエラーを補足したらそれを単純に表示するようにしてみた。後、データが取得できた場合は、XML文字列が帰ってきてるのでそれをパースしてデータを確認できるURLに整形してみた(urlの解説)

require "xmlrpc/client"
require "rubygems"
require "xmlsimple"

FLICKR_SERVER = "http://api.flickr.com/services/xmlrpc/"
API_KEY = "ここは自分のAPI Keyを入れる"

client = XMLRPC::Client.new2(FLICKR_SERVER)
begin
  result = client.call("flickr.photos.getRecent",{"api_key"=>API_KEY,"page"=>1,"per_page"=>5})
  xml = XmlSimple.xml_in(result)
  xml["photo"].each { |photo|
    puts "http://farm#{photo["farm"]}.static.flickr.com/#{photo["server"]}/#{photo["id"]}_#{photo["secret"]}.jpg"
  }

rescue XMLRPC::FaultException => error
p  error.faultCode
p  error.faultString
end

これで通信してデータの取得はできた。エラーが合った場合は、error.falutCodeにAPIのところでかかれているエラーコードがキチンと入っているし便利。次は、サーバー側の処理を作ってみるかな。