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が利用できて良さそうです。
別の記事で開発ツールのほうにも触れられたらなと思います。