Ruby 1.9.3p0でEvernote API 1.20のOAuth版サンプルを動かしてみた

ちょっとEvernoteと連携したサービスを作りたくなったので、Evernote API 1.20(本記事執筆時点の最新版)をダウンロードして、サンプルを動かしてみました。


動かしたのはRubyのサンプル。
手でビルドしたRuby 1.9.3p0を使ってサンプル(ruby/sample/oauth/evernote_oauth.rb)を動かしてみたところ、OAuthでの認証はうまく行きましたが、ノートブック一覧を取得しようとすると、
    Error listing notebooks: can't convert nil into String
と言われて失敗します。


例外のバックトラックを見てみると、oauth/thrift/transport/http_client_transport.rbで、Net::HTTPでPOSTし、そのレスポンスデータをStringIOのコンストラクタに渡しているところでエラーになっている模様。

Net::HTTPのドキュメントを見てみると、
バージョン 1.1 では HTTPResponse と エンティティボディ文字列の 二要素の配列です。1.2 では HTTPResponse ただひとつのみです。この場合、エンティティボディは response.body で得られます。
と書かれていて、更にバージョン 1.1はbundled with Ruby 1.6、バージョン 1.2はbundled with Ruby 1.7 or laterだと言っています。どうやらRuby 1.9.3p0ではpostメソッドは戻り値を1つしか返さないため、戻り値の受け方が間違っているようです。


ということで、
    #resp, data = http.post(@url.request_uri, @outbuf, @headers)
    #@inbuf = StringIO.new data
    resp = http.post(@url.request_uri, @outbuf, @headers)
    @inbuf = StringIO.new resp.body
のように修正して動かしてみると、ちゃんとノートブック一覧を取得できるようになりました。


ずいぶん昔のバージョンのThriftで生成したコードなのかな?

Comments

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる