RedmineのREST APIを使ってみる

社内に突っ込んだRedmineが大盛況になりました。「便利なツールが使われる」は達成できたので、「そのツールを活かして業務を改善する」まで今年持って行きたい。多分、結構な人数で使っているので、Redmineの勉強会がまたあったら事例共有しようと思うのですが、人数が増えるとやっぱりリクエストが増えます。「わがままいうな!やりたきゃてめーでやれ!」という心の声は置いておいて、今回は、RedmineにRESTでチケット登録したいという要望があったので、ちょっと調べたこと、困ったこと、できたことを共有させていただきます。

とても参考になったのがRedmine REST api を触ってみた。 by ka-ka_xyzの日記さんのページです。ありがとうございます。

準備はいいか?

Redmine REST APIは、2010/03/06ではまだ正式にリリースされていないみたいです。これを利用する場合は、

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile1.txt

REST APIのページにも書かれているように、trunkから一定以上のリビジョンを取得する必要があります。
今回は、r3546をSubversionから取得しました(Redmine DownloadにSVNのURLがある)。

まず設定。管理>設定>認証>認証が必要にチェックが入っていなければいいのですが、藤原は認証をかけているので、「RESTによるWebサービスを有効にする」にチェックを入れます。
001

すると、右上にある個人設定を開くと、右側にAPIアクセスキーが表示されます。このキーをもとに認証したとみなすみたいですね。

これをちゃんと設定しないと、RedmineのRESTを使う場合、認証に失敗すると「401 Unauthorized http://localhost/issues.xml」とか怒られます。

チケットを取得する

ためしにデータ取得してみます。
藤原はPUT/DELETEメソッドを簡単に「RESTClient」を参考に、RESTClientを使いました。
FireFoxのRESTTestを使っていたのですが、FFでRedmineにログインしていると、RESTTestもログインしているものとみなして動くみたいで、「wgetだとうごかねー!」「curlだと動かねー!」とパニックになりました。パニックは現場でおきます。

003

GETで「http://localhost:3000/issues.xml?key=24752bfbeccaa9f094c2f3f0c81ea39b70ae25fe」にリクエストを投げてみると、レスポンスにXML形式でチケット一覧が確認できます。やったね。

チケットを作成する

これ手こずりました。なんせサンプルがない!
まず、試したRedmineのバージョンでは「HTTP/1.1 401 Unauthorized」になります。処理をトレースしてみて見つけたのですが、issues_controller.rbの27行目で許可するメソッド?を定義しているところがあり、ここにnew、update、destroyが書かれていないので、RESTを使ってなにもできないのかなーと思ってます(コミュニティに投稿しとくかな)。
なんで、以下のように書き換えました。

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile2.txt

これでメソッドをPOSTで「http://localhost:3000/issues.xml?format=xml&key=24752bfbeccaa9f094c2f3f0c81ea39b70ae25fe」に以下のデータを送信すれば投稿できるはずです。「format=xml」というパラメタも必要らしいです。また投げるときはContent-Typeを「text/xml」にしないと

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile3.txt

と怒られます。

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile4.txt

チケットの更新

PUTで「http://localhost:3000/issues/[更新するチケットのID].xml?format=xml&key=24752bfbeccaa9f094c2f3f0c81ea39b70ae25fe」に以下のデータを送信します。

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile5.txt

チケットの削除

DELETEで「http://localhost:3000/issues/[削除するチケットのID].xml?format=xml&key=24752bfbeccaa9f094c2f3f0c81ea39b70ae25fe」するだけです。

困ったこと

404とかが出た場合は、トラッカーのIDがみつからないよーとかです。きっと。
また、エラーメッセージが返ってくる場合もあります。

https://gist.github.com/daipresents/bc5b98d192f2092fa785b17fc51fccf1.js?file=gistfile6.txt

こういう場合は何をいっているかわからないのでこちらとかで日本語化してみてください。

まとめ

RedmineのREST APIはまだ開発中なので仕様が変わる可能性があります。しかし、これがあると何かと便利でして

  • エンジニアじゃない人向けに、簡単なUIつくって簡単ポスト
  • どっかのデータからRedmineにチケット化

などができるようになります。

また、こういう開発中の機能を調べるのは大変ですが楽しいものです。
ソースを読んでいると学ぶことがたくさんあります。
つーかそろそろRailsを想像で書くのをやめないといけない・・・。Rails本を読みます。