はじめに
こんにちは、サービスグロースチームの筧です。
最近、Backlog API を利用する機会がありました。その際に、エラー内容の確認方法について学びがあったのでご紹介します。
前提
以下を利用する前提で進めます。
- Backlog API とは | Backlog Developer API | Nulab
- python3.9
- Requests ライブラリ
- Lambda
- CloudWatch Logs
学んだこと
レスポンスのテキストデータを出力しておくと、開発時やエラー対応時の調査がはかどる。
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 を使った際に、レスポンスボディの取得で困る方がいるかもと思って書いてみました。 どなたかの役に立っていると嬉しいです。
それではまた!