Backlog のAPI実行に backlog_kit(Ruby用のライブラリ) を使っていましたが、0.17.0に更新後エラーが出たので情報共有です。
関連仕様とエラーになる条件
Backlogでは 2017年9月にドメインの変更( .jp から .com ) がありましたが、それ以前に作成したスペースは .jp ドメインのままで運用されています。
backlog_kitの方は 0.17.0でデフォルトドメインの修正が入った ため、使っているスペースのドメインとbacklog_kitのバージョンの組み合わせにより問題が発生するようになりました。
- 使っているスペースが .jpドメイン(2017年9月頃以前に作成) かつ
- backlog_kit が 0.17.0 以降
あるいは、あまり無いパターンですが
- 使っているスペースが .comドメイン(2017年9月頃以降に作成) かつ
- backlog_kit が 0.16.0 以前
でこのエラーが発生します。
エラー内容
エラーが再現するスクリプトは以下になります。
#!/usr/bin/ruby
# encoding: utf-8
require 'backlog_kit' # 0.17.0
require 'pp'
# セッション作成
client = BacklogKit::Client.new(
space_id: '< .jp ドメインのスペースIDを設定>',
api_key: '<APIキーを設定>'
) # key of user
# プロジェクト一覧を取得
result_obj = client.get('projects') # API: /api/v2/projects
puts PP.pp(result_obj,'')
.jp ドメインのスペースでこれを実行するとNoMethodErrorが発生します。
Traceback (most recent call last):
13: from backlog_post_monthly_report_test2.rb:18:in `<main>'
12: from /var/lib/gems/2.5.0/gems/backlog_kit-0.17.0/lib/backlog_kit/client.rb:97:in `get'
11: from /var/lib/gems/2.5.0/gems/backlog_kit-0.17.0/lib/backlog_kit/client.rb:140:in `request'
10: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/connection.rb:138:in `get'
9: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/connection.rb:387:in `run_request'
8: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/rack_builder.rb:143:in `build_response'
7: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/request/multipart.rb:15:in `call'
6: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/request/url_encoded.rb:15:in `call'
5: from /var/lib/gems/2.5.0/gems/faraday_middleware-0.12.2/lib/faraday_middleware/response_middleware.rb:31:in `call'
4: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/response.rb:8:in `call'
3: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/response.rb:61:in `on_complete'
2: from /var/lib/gems/2.5.0/gems/faraday-0.15.3/lib/faraday/response.rb:9:in `block in call'
1: from /var/lib/gems/2.5.0/gems/backlog_kit-0.17.0/lib/backlog_kit/response/file_parser.rb:9:in `on_complete'
/var/lib/gems/2.5.0/gems/backlog_kit-0.17.0/lib/backlog_kit/response/file_parser.rb:19:in `decoded_filename': undefined method `match' for nil:NilClass (NoMethodError)
対応方法
環境変数 'BACKLOG_TOP_LEVEL_DOMAIN' を使っているスペースに合わせて設定すれば正常にAPI実行できるようになります。
#!/usr/bin/ruby
# encoding: utf-8
require 'backlog_kit' # 0.17.0
require 'pp'
# ドメイン設定
ENV['BACKLOG_TOP_LEVEL_DOMAIN'] = 'jp'
# セッション作成
client = BacklogKit::Client.new(
space_id: '< .jp ドメインのスペースIDを設定>',
api_key: '<APIキーを設定>'
) # key of user
# プロジェクト一覧を取得
result_obj = client.get('projects') # API: /api/v2/projects
puts PP.pp(result_obj,'')
あるいは実行ユーザの環境変数に設定しても大丈夫です。
$ export BACKLOG_TOP_LEVEL_DOMAIN=jp
$ ruby test.rb
#<BacklogKit::Response:0x0000xxxxxxxxxx18
@body=
[#<BacklogKit::Resource:0x0000xxxxxxxxxx18
@attributes=
{:id=>99999,
:projectKey=>"VATEST",
:name=>"TESTプロジェクト",
:chartEnabled=>false,
:subtaskingEnabled=>true,
:projectLeaderCanEditProjectLeader=>false,
:useWikiTreeView=>true,
:textFormattingRule=>"backlog",
:archived=>false,
:displayOrder=>0}>,
※以下省略※
使っているBacklogスペースが .com ドメインの場合で backlog_kit 0.16.0 以前を使う場合は、BACKLOG_TOP_LEVEL_DOMAIN を 'com' に設定して下さい。
エラーの原因
詳細は追っていないのですが、自分のドメインでない方にリクエストを投げた際、APIのレスポンスとしては 302 (Found) が返ってきていました。 backlog_kitが302をうまく処理できていないために発生しているものと思われます(他言語や別のAPIライブラリでも必ず起きる問題ではなさそうです)。