Backlog API と Requests ライブラリを利用時のログ確認方法について

Backlog API と Requests ライブラリを利用時に、レスポンスボディの取得で困っていませんか? 本ブログではそんな方に向けて取得方法をご紹介します。
2022.08.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、サービスグロースチームの筧です。

最近、Backlog API を利用する機会がありました。その際に、エラー内容の確認方法について学びがあったのでご紹介します。

前提

以下を利用する前提で進めます。

学んだこと

レスポンスのテキストデータを出力しておくと、開発時やエラー対応時の調査がはかどる。

sample.py

def update_issue(self, issue_id, item_id):
    # refs: https://developer.nulab.com/ja/docs/backlog/api/2/update-issue/
    url = f"https://{self._fqdn}/api/v2/issues/{issue_id}?apiKey={self._api_key}"
    data = {"customField_123456789": item_id}
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    resp = requests.patch(url, data=data, headers=headers)
    logger.info(resp.text)  # レスポンスのテキストデータを出力
    resp.raise_for_status()  # 200番台以外なら例外発生させる
    return resp

どういうことか

リクエストが成功した場合と失敗した場合について、Lambda の Cloudwatch Logs の出力内容を確認してみましょう。前述にレスポンスのオブジェクトの出力コード(7行目)を加えた、ハイライトの箇所の出力を確認します。

sample.py

def update_issue(self, issue_id, item_id):
    # refs: https://developer.nulab.com/ja/docs/backlog/api/2/update-issue/
    url = f"https://{self._fqdn}/api/v2/issues/{issue_id}?apiKey={self._api_key}"
    data = {"customField_123456789": item_id}
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    resp = requests.patch(url, data=data, headers=headers)
    logger.info(resp) # レスポンスのオブジェクトを出力
    logger.info(resp.text)  # レスポンスのテキストデータを出力
    resp.raise_for_status()  # 200番台以外なら例外発生させる
    return resp

成功した場合

引数に適切な値を入力した場合の出力を確認してみます。 レスポンスのオブジェクトの出力には 200番応答したこと、レスポンスのテキストデータを出力には公式ドキュメントのレスポンスボディが表示されています

# logger.info(resp) # レスポンスのオブジェクトを出力
[INFO]	2022-08-13T05:21:53.570Z	6f01b3a1-4d6f-4f2e-b46b-65a1930fec90	<Response [200]>

# logger.info(resp.text)  # レスポンスのテキストデータを出力
[INFO]	2022-08-13T05:21:53.571Z	6f01b3a1-4d6f-4f2e-b46b-65a1930fec90	{
    "id": 234568901,
    "projectId": 123456789,
..snip..
}

# resp.raise_for_status()  # 200番台以外なら例外発生させる
# 200番応答なので出力なし

課題の追加 | Backlog Developer API | Nulab

失敗した場合

引数に不適切な値を入力した場合の出力を確認してみます。 レスポンスのオブジェクトの出力には 400番応答したこと、レスポンスのテキストデータを出力には公式ドキュメントのエラーレスポンスボディが表示されています。Responseオブジェクトのraise_for_statusメソッドの出力には、 400番応答したこと・リクエストURL・エラーの発生箇所などが表示されています。

# logger.info(resp) # レスポンスのオブジェクトを出力
[INFO]	2022-08-13T07:01:58.994Z	bfef944f-2441-4449-b207-e6f5aa04fe63	<Response [400]>

# logger.info(resp.text)  # レスポンスのテキストデータを出力
[INFO]	2022-08-13T07:01:58.994Z	bfef944f-2441-4449-b207-e6f5aa04fe63	{
    "errors": [
        {
            "message": "err.customField.value.requireItemId",
            "code": 7,
            "moreInfo": ""
        }
    ]
}

# resp.raise_for_status()  # 200番台以外なら例外発生させる
[ERROR] HTTPError: 400 Client Error: Bad Request for url: https://{FQDN}.backlog.jp/api/v2/issues/{課題キー}?apiKey=xxxxx
Traceback (most recent call last):
  File "/var/task/src/handlers/sample.py", line 17, in handler
    raise e
  File "/var/task/src/handlers/sample.py", line 14, in handler
    src.use_cases.sample.exec()
  File "/var/task/src/use_cases/sample.py", line 30, in exec
    return use_case.exec()
  File "/var/task/src/use_cases/sample.py", line 17, in exec
    self.backlog_service.update_issue(issue_id, item_id)
  File "/var/task/src/services/backlog.py", line 34, in update_issue
    resp.raise_for_status()  # 200番台以外なら例外発生
  File "/var/task/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)

エラーレスポンス | Backlog Developer API | Nulab

結論

レスポンスのテキストデータを出力しておくと、レスポンスボディが確認できるので、開発時やエラー対応時の調査がはかどる。

おわりに

最後まで読んでいただきありがとうございます。

Backlog API を使った際に、レスポンスボディの取得で困る方がいるかもと思って書いてみました。 どなたかの役に立っていると嬉しいです。

それではまた!