Ruby 2.xでXMLRPCが使えない
はてなキーワード連想語検索APIをRuby2.1で使おうとしたらハマったのでメモ。
元のコード
はてなキーワード連想語API - Hatena Developer Center
#!/usr/bin/env ruby $KCODE = "u" require "xmlrpc/client" server = XMLRPC::Client.new("d.hatena.ne.jp", "/xmlrpc") result = server.call("hatena.getSimilarWord", { "wordlist" => %w[ Hatena Ruby ] }) puts result['wordlist'].map {|v| v['word'] }.join(', ')
Hatena Ruby くらいの単語だと大丈夫なんだけど、ちょっと長い単語とか日本語とか投げ込むと以下のようなエラー
/usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:511:in `do_rpc': Wrong size. Was 487, should be 223 (RuntimeError) from /usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:286:in `call2' from /usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:267:in `call' from hatena.rb:7:in `<main>'
原因
しらべてみるとこれが引っかかった。
Bug #8182: XMLRPC request fails with "Wrong size. Was 31564, should be 1501" - ruby-trunk - Ruby Issue Tracking System
- Ruby 2.0以降のNet::HTTPはHTTP圧縮がデフォルト
- XMLRPCはNet::HTTPを使ってるがHTTP圧縮を想定していないバイト数チェックをしてるらしい
解決策
とりあえずHTTP圧縮を無効にしてみる
require "xmlrpc/client" server = XMLRPC::Client.new("d.hatena.ne.jp", "/xmlrpc") # この一行を追加 server.http_header_extra = {'accept-encoding' => 'identity'}
この後は最初のと一緒
とりあえず解決できたけど結局HTTP圧縮使えてない...