Redmine REST API入門

本村 真一(ファーエンドテクノロジー株式会社)
作成日

Redmineには、Webブラウザからの操作だけでなく、外部のプログラムやツールからRedmineのデータを操作するための「REST API」(用語解説)が用意されています。

「API」と聞くとプログラミングが必要そうに感じるかもしれませんが、基本的な操作であれば curl というコマンドを使って簡単に試すことができます。

この記事では、REST APIの基本的な仕組みを確認したあと、実際に curl を使ってチケットの取得・作成・更新などを行います。

この記事でできるようになること

この記事を最後まで読むと、Webブラウザを開かずに、REST APIを使って次のような操作ができるようになります。

  • Redmineのチケット情報を取得・確認する
  • REST APIから新しいチケットを作成する
  • 既存チケットの題名やコメント(コメント)を更新する
  • ユーザー情報を作成・検索・更新する

目次

  1. RedmineのREST APIとは
  2. REST APIを使うための準備
  3. チケットを取得する
  4. チケットを作成する
  5. チケットを更新する
  6. ユーザーを作成・更新する
  7. REST APIを実際に利用するときに知っておきたいこと
  8. REST APIをプログラムから利用する
  9. 関連情報

RedmineのREST APIとは

REST APIの基本

REST APIは、Webブラウザで画面を操作する代わりに、HTTPリクエストを使ってRedmineのデータにアクセスするための仕組みです。

例えば、Webブラウザでチケット一覧を開く代わりに、

GET /issues.json

というリクエストをRedmineへ送ると、チケットの一覧をJSON形式で取得できます。

新しいチケットを登録するときは、

POST /issues.json

既存のチケットを更新するときは、

PUT /issues/123.json

のようにリクエストします。

URLで「何を操作するのか」を指定し、HTTPメソッドで「どのような操作をするのか」を指定すると考えると分かりやすいでしょう。

REST APIで使うHTTPメソッド

RedmineのREST APIでは、主に次のHTTPメソッドを使います。

HTTPメソッド 主な用途
GET データを取得する
POST データを作成する
PUT データを更新する
DELETE データを削除する

JSON形式でデータをやり取りする

RedmineのREST APIではJSON形式とXML形式を利用できます。

この記事では、扱いやすいJSON形式を使います。

REST APIを使うための準備

REST APIを利用するには、RedmineでREST APIを有効にし、認証に使用するAPIアクセスキーを確認しておく必要があります。

設定方法は、Redmine.JPの次の記事を参照してください。

この記事では、「REST APIが有効になっている」、「APIアクセスキーを確認済みである」ことを前提に進めます。

URLとAPIアクセスキーを環境変数に設定する

以降のコマンドを試しやすくするため、RedmineのURLとAPIアクセスキーを環境変数に設定しておきます。

export REDMINE_URL="https://redmine.example.net"
export REDMINE_API_KEY="ここにAPIアクセスキーを入力"

https://redmine.example.net の部分は、利用しているRedmineのURLに置き換えてください。

APIアクセスキーはパスワードと同様に重要な情報です。第三者に公開したりしないよう注意してください。

この記事の例ではmacOSやLinuxなどのシェルを想定しています。

JSONを読みやすく表示する

REST APIから取得したJSONは、そのままでは1行で表示されることがあります。

jq というコマンドを利用すると、JSONを整形して読みやすく表示できます。

この記事では、REST APIの実行結果を確認しやすくするため、一部の例で次のように jq を使用します。

curl ... | jq .

jqをインストールしていない場合は、| jq . を取り除いてもREST API自体は利用できます。

チケットを取得する

まずは、Redmineに登録されているチケットを取得してみましょう。

チケットの一覧を取得する

次のコマンドを実行します。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/issues.json?limit=5" | jq .

正常にアクセスできると、次のようなJSONが返ってきます。

{
  "issues": [
    {
      "id": 123,
      "project": {
        "id": 1,
        "name": "サンプルプロジェクト"
      },
      "tracker": {
        "id": 1,
        "name": "バグ"
      },
      "status": {
        "id": 1,
        "name": "新規"
      },
      "subject": "サンプルチケット"
    }
  ],
  "total_count": 10,
  "offset": 0,
  "limit": 5
}

issues の中にチケットの情報が入っています。

チケットID、プロジェクト、トラッカー、ステータス、題名など、Redmineの画面で確認できる情報をREST APIから取得できます。

チケット一覧のJSON チケット一覧のJSONの一部

特定のチケットを取得する

チケットIDをURLに指定すると、特定のチケットを取得できます。

例えばチケット番号123を取得する場合は次のようにします。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/issues/123.json" | jq .

URLは次のようになります。

/issues/チケットID.json

Webブラウザではチケットの画面を開いて確認しますが、REST APIではこのようにURLを指定して同じチケットのデータを取得できます。

チケットを作成する

REST APIでは、情報を取得するだけでなく、新しいチケットを作成することもできます。

プロジェクトIDとトラッカーIDを確認する

チケットを作成する際には、登録先のプロジェクトなどをIDで指定します。

プロジェクトIDは次のREST APIで確認できます。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/projects.json" \
  | jq '.projects[] | {id, name, identifier}'

例えば次のように表示されます。

{
  "id": 1,
  "name": "サンプルプロジェクト",
  "identifier": "sample"
}

トラッカーIDは次のコマンドで確認できます。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/trackers.json" \
  | jq '.trackers[] | {id, name}'

例えば次のように表示されます。

{
  "id": 1,
  "name": "バグ"
}

実際に利用するときは、自分のRedmineで表示されたIDを使用してください。

チケットを作成する

プロジェクトIDが 1、トラッカーIDが 1 だった場合、次のコマンドでチケットを作成できます。

curl --request POST \
  --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  --header "Content-Type: application/json" \
  --data '{
    "issue": {
      "project_id": 1,
      "tracker_id": 1,
      "subject": "REST APIから登録したチケット",
      "description": "curlを使ってREST APIから登録しました"
    }
  }' \
  "${REDMINE_URL}/issues.json" | jq .

チケット一覧を取得したときとの主な違いは3点あります。

--request POST

でPOSTリクエストであることを指定しています。

また、

Content-Type: application/json

で、Redmineへ送信するデータがJSON形式であることを指定しています。

そして --data で、作成するチケットの内容をJSON形式で指定しています。

{
  "issue": {
    "project_id": 1,
    "tracker_id": 1,
    "subject": "REST APIから登録したチケット",
    "description": "curlを使ってREST APIから登録しました"
  }
}

コマンドが正常に実行されると、新しいチケットが作成されます。

RedmineをWebブラウザで開き、チケットが登録されていることも確認してみましょう。

REST APIから登録したチケット 「REST APIから登録したチケット」のチケット詳細画面

チケット作成を応用すると何ができるか

このように、Webブラウザで「新しいチケット」画面を開いて入力しなくても、REST APIを使ってチケットを作成できます。

例えば、

  • 別のシステムでエラーが発生したらRedmineにチケットを登録する
  • 定期的に行う作業のチケットを自動で作成する

といった処理にも応用できます。

チケットを更新する

次は、作成したチケットを更新してみましょう。

チケットの題名とコメントを更新する

ここではチケット番号960の題名を変更し、コメントも追加する例を示します。

curl --request PUT \
  --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  --header "Content-Type: application/json" \
  --data '{
    "issue": {
      "subject": "REST APIから題名を変更しました",
      "notes": "curlを使ってREST APIから更新しました"
    }
  }' \
  "${REDMINE_URL}/issues/960.json"

960 の部分は、実際に更新したいチケットのIDに置き換えてください。

チケットの作成とは異なり、次のようにPUTリクエストを指定しています。

--request PUT

送信しているJSONは次の部分です。

{
  "issue": {
    "subject": "REST APIから題名を変更しました",
    "notes": "curlを使ってREST APIから更新しました"
  }
}

subject で題名を変更し、notes でチケットにコメントを追加しています。

更新後にWebブラウザでチケットを確認すると、通常の画面操作で編集した場合と同じように変更内容が反映されます。

更新後のチケット詳細画面 更新後のチケット詳細画面

ステータスや担当者を更新する

ステータスや担当者などを変更する場合も同じ考え方です。

例えば、

{
  "issue": {
    "status_id": 2,
    "assigned_to_id": 5
  }
}

のように、変更したい項目をJSONで指定します。

利用できる項目や値については、Redmine公式サイトの「Issues」REST APIリファレンスで確認できます。

ユーザーを作成・更新する

ここまではチケットを例にしましたが、REST APIで操作できるのはチケットだけではありません。

例えば、ユーザーの作成や検索・更新も行えます。

ユーザー操作に必要な権限

ユーザーの作成・更新やユーザー情報の取得には、システム管理者権限を持つユーザーのAPIアクセスキーが必要です。

以降の操作を試す場合は、システム管理者権限を持つユーザーのAPIアクセスキーを使用してください。

ユーザーを作成する

次のようなPOSTリクエストを /users.json に送信します。

curl --request POST \
  --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  --header "Content-Type: application/json" \
  --data '{
    "user": {
      "login": "api-test",
      "firstname": "API",
      "lastname": "テスト",
      "mail": "api-test@example.net",
      "generate_password": true
    },
    "send_information": false
  }' \
  "${REDMINE_URL}/users.json" | jq .

ユーザーの一覧画面 REST APIから作成したユーザーが表示されているユーザー画面

ユーザーIDを確認する

既存のユーザーをREST APIで更新するときは、対象となるユーザーの「ユーザーID」が必要です。

ユーザーIDは、Redmineの管理画面またはREST APIで確認できます。

管理画面で確認する

システム管理者としてRedmineにログインし、次の順に操作します。

  1. 「管理」をクリックする
  2. 「ユーザー」をクリックする
  3. 対象ユーザーのログインIDをクリックする

ユーザー編集画面のURLは、次のような形式です。

https://redmine.example.net/users/ユーザーID/edit

例えばURLが、

https://redmine.example.net/users/166/edit

であれば、ユーザーIDは 166 です。

ユーザー編集画面 作成したユーザーの情報を編集する画面

REST APIで確認する

ユーザーIDはREST APIを使って調べることもできます。

Users REST APIを利用してユーザーを検索すると、ユーザーIDを含む情報がJSON形式で返されます。

ログインIDを基にユーザーを検索する場合は、次のように実行します。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/users.json?name=ログインID" | jq .

例えば、ログインIDが api-test のユーザーを検索する場合は次のようになります。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/users.json?name=api-test" | jq .

また、現在登録されているメールアドレスをもとに検索することもできます。

curl --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  "${REDMINE_URL}/users.json?mail=メールアドレス" | jq .

例えば、次のようなJSONが返ります。

{
  "users": [
    {
      "id": 166,
      "login": "api-test",
      "firstname": "API",
      "lastname": "テスト",
      "mail": "api-test@example.net"
    }
  ],
  "total_count": 1,
  "offset": 0,
  "limit": 25
}

この場合、id の値である 166 がユーザーIDです。

ユーザーを更新する

ユーザーIDを確認したら、その値を使ってユーザーを更新します。

ユーザーIDが166のユーザーの姓を変更する場合は、次のようにPUTリクエストを送ります。

curl --request PUT \
  --header "X-Redmine-API-Key: ${REDMINE_API_KEY}" \
  --header "Content-Type: application/json" \
  --data '{
    "user": {
      "lastname": "テスト更新"
    }
  }' \
  "${REDMINE_URL}/users/166.json"

ユーザーの作成・更新について詳しくは、Redmine公式サイトの「Users」REST APIリファレンスを参照してください。

REST APIを実際に利用するときに知っておきたいこと

ここまで、チケットやユーザーを例にREST APIの基本的な使い方を紹介しました。

実際にREST APIを利用するときには、ほかにも知っておきたい点があります。

REST APIで操作できる主なデータ

Redmineには、チケットやユーザー以外にもさまざまなREST APIがあります。

例えば次のようなデータを扱えます。

  • プロジェクト
  • トラッカー
  • ロール
  • グループ
  • Wikiページ

利用できるREST APIの一覧と、それぞれの詳しい仕様はRedmine公式サイトの「Redmine API」で確認できます。

REST APIで実現したいことがあれば、

  1. 対象となるREST APIのリファレンスを確認する
  2. 使用するURLとHTTPメソッドを確認する
  3. 必要なパラメータを確認する
  4. まずcurlで試してみる

という順番で進めると分かりやすいと思います。

一覧を取得するときは件数に注意する

チケット一覧やユーザー一覧など、複数のデータを取得するREST APIでは、一度のリクエストですべてのデータが返されるとは限りません。

例えば、

GET /issues.json

のレスポンスには、次のような情報が含まれます。

{
  "total_count": 250,
  "offset": 0,
  "limit": 25
}

total_count は対象となるデータの総数、limit は今回取得した最大件数、offset は取得開始位置です。

取得する件数は limit で指定できます。

/issues.json?limit=100

続きを取得するときは offset を指定できます。

/issues.json?offset=100&limit=100

大量のデータをプログラムから取得するときは、繰り返しの処理を考慮する必要があります。

APIアクセスキーを公開しない

REST APIを利用すると、Webブラウザを操作することなくRedmineのデータを取得・変更できます。その分、認証情報や実行する処理の取り扱いには注意が必要です。

APIアクセスキーを取得した人は、そのキーが発行されたユーザーの権限でREST APIを利用できます。

APIアクセスキーをGitリポジトリへ登録したり、Webページやチャットなどに貼り付けたりしないよう注意してください。

漏えいした可能性がある場合は、Redmineの個人設定画面からAPIアクセスキーをリセットしてください。

Redmine上の権限が適用される

REST APIを利用したからといって、Redmineの権限設定を無視して操作できるわけではありません。

例えば、チケットを作成する権限がないユーザーのAPIアクセスキーを使ってチケットを作成することはできません。

また、ユーザーの作成・更新など、一部のREST APIはシステム管理者のみ利用できます。

システム管理者権限での実行に注意する

システム管理者権限が付与されたユーザーのAPIアクセスキーを用いると、システム管理者だけが実行できる操作もREST APIから行えます。

誤操作による影響も大きいため、更新や削除を行う処理は事前に十分確認してから実行しましょう。

REST APIをプログラムから利用する

この記事ではREST APIの仕組みを理解しやすいようにcurlを使いましたが、実際のシステム連携ではRubyなどのプログラムから同じHTTPリクエストを送信できます。

例えば、

  • 別システムで登録された情報をRedmineにも登録する
  • 人事情報とRedmineのユーザー情報を連携する
  • 条件に応じてチケットを自動作成・更新する

といった処理が実装できます。

curlでREST APIのURL、HTTPメソッド、JSONの指定方法を理解しておくと、プログラムから利用するときにも役立ちます。