More than 1 year has passed since last update.

Hamee Advent Calendar 2015の21日目です。

はじめに

Railsで開発ツールを作る過程でAPIを叩くのにActiveResourceを使ったのでその紹介をしようと思います。
今回はRedmine APIを利用します。

環境

Mac OSX 10.10.3
Ruby 2.2.3
Rails 4.2.4

ActiveResourceの概要

ActiveRecordでDB操作を行うのと同じような書き方でREST APIを利用できます。
JSON等のレスポンスをオブジェクトに変換したりといったこともActiveResourceがやってくれます。
Rails4ではコアから除外され、Gemとして提供されています。

Redmineのテスト環境を準備する

http://m.redmine.org/hostings/new
上記リンク先でRedmineのテスト環境を作ることができます。
今回はこの環境のAPIを利用します。

Redmine APIを叩いてみる

URLを設定する

class Issue < ActiveResource::Base
    self.site = 'http://XXXX.m.redmine.org'
    self.headers['X-Redmine-API-Key'] = 'XXXX'
    self.format = :xml

    #Basic認証を行うなら
    self.user = ''
    self.password = ''

    #siteの後に続くパス
    self.prefix = ''
end

ActiveResource::Baseを継承することでAPI接続を行うクラスを作成することができます。
self.siteでアクセスするURL、self.headersでリクエストヘッダにRedmineのAPIキーを指定しています。
今回は使用しませんが、ActiveResourceはBasic認証もサポートしています。

ActiveResouceによって内部的に作られるアクセス先にURLは、
#{site}#{prefix}#{クラス名の複数形}にidや拡張子をつけたものになります。
例えば上記のIssueクラスならhttp://XXXX.m.redmine.org/issues.xmlやhttp://XXXX.m.redmine.org/issues/1.xmlといった感じです。

formatはJSONとXMLを指定できるのですが、JSONにするとオブジェクトとJSON間の変換がうまくいかないのか、チケットの更新などができませんでした。
なぜ失敗するのか分かってないので、調べてみようと思います。

チケットを取得して更新する

各クラスの親としてURLの設定だけしたBaseクラスがあるものとします。


class Base < ActiveResource::Base
    self.site = 'http://XXXX.m.redmine.org'
    self.headers['X-Redmine-API-Key'] = 'XXXX'
    self.format = :xml
end

findでオブジェクトを取得して、プロパティの値を変更してsaveというActiveRecordでDB操作を行うのと同じ感覚でAPIを利用できます。

class Issue < Base
end

#全件取得
Issue.find(:all)

#チケットIDが1のチケットを取得してタイトルを変更
ticket = Issue.find(1)
ticket.subject = 'hoge'
ticket.save

プロジェクトメンバーを取得する

prefixを利用する場合の例としてプロジェクトメンバーの一覧を取得してみます。
下記の例だとhttp://XXXX.m.redmine.org/projects/hoge/memberships.xmlにアクセスします。
hogeの部分がプロジェクト名です。

class Membership < Base
    self.prefix = '/projects/' + 'hoge' + '/'
end

Membership.find(:all)

終わりに

なにかしらのAPIを利用するときには良さそうなGemがなかったりで自分で実装することになったら、ActiveResouceを使うと簡単にAPIが利用できて良さそうです。
別の記事で開発ツールのほうにも触れられたらなと思います。

参考