3月 6th, 2010at 14:31

Tags:

RedmineのREST APIを使ってみる

このエントリーをはてなブックマークに追加

社内に突っ込んだRedmineが大盛況になりました。
「便利なツールが使われる」は達成できたので、「そのツールを活かして業務を改善する」まで今年持って行きたい。

多分、結構な人数で使っているので、Redmineの勉強会がまたあったら事例共有しようと思うのですが、人数が増えるとやっぱりリクエストが増えます。「わがままいうな!やりたきゃてめーでやれ!」という心の声は置いておいて、今回は、RedmineにRESTでチケット登録したいという要望があったので、ちょっと調べたこと、困ったこと、できたことを共有させていただきます。

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

準備はいいか?

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

At the time of writing, the API is only available in trunk (see r3310, r3313).

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

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

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

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

チケットを取得する

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

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

チケットを作成する

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

accept_key_auth :index, :show, :changes, :new, :update, :destroy

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

Form authenticity token is missing or is invalid. API calls must include a proper Content-type header (text/xml or text/json).

と怒られます。

 <issue>
<project_id>rest</project_id>
<tracker_id>3</tracker_id>
<status_id>2</status_id>
<priority_id>5</priority_id>
<assigned_to_id>1</assigned_to_id>
<subject>こんにちは世界</subject>
<description>ありがとう世界</description>
<start_date>2010-03-01</start_date>
<due_date>2010-03-02</due_date>
<done_ratio>10</done_ratio>
<estimated_hours>10.5</estimated_hours>
<custom_field_values>
<1>カスタムなテキストフィールド</1>
<2>11111</2>
<3>0.33</3>
<4>ううう</4>
<5>1978-05-08</5>
<6>1</6>
</custom_field_values>
</issue>

チケットの更新

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

 <issue>
<project_id>rest</project_id>
<tracker_id>2</tracker_id>
<status_id>3</status_id>
<priority_id>7</priority_id>
<assigned_to_id>3</assigned_to_id>
<subject>こんにちは世界2</subject>
<description>ありがとう世界2</description>
<start_date>2010-03-03</start_date>
<due_date>2010-03-04</due_date>
<done_ratio>20</done_ratio>
<estimated_hours>20.5</estimated_hours>
<custom_field_values>
<1>カスタムなテキストフィールド2</1>
<2>111112</2>
<3>0.332</3>
<4>いいい</4>
<5>1978-05-09</5>
<6>0</6>
</custom_field_values>
</issue>

チケットの削除

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

困ったこと

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

<?xml version="1.0" encoding="UTF-8"?>
<errors>
<error>&#20778;&#20808;&#24230; &#12434;&#20837;&#21147;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;</error>
<error>&#12459;&#12473;&#12479;&#12512;&#12394;&#12522;&#12473;&#12488;&#12501;&#12451;&#12540;&#12523;&#12489; &#12399;&#19968;&#35239;&#12395;&#12354;&#12426;&#12414;&#12379;&#12435;&#12290;</error>
</errors>

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

まとめ

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

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

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

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

このエントリーをはてなブックマークに追加