REST APIでRedmineアクセス(2)
2025/05/04 | |||
[Prev] [Next] [Top] , Python [Prev] [Next] , [Python Top] | |||
今回は具体的な操作を
チケット(Issue): offset設定で全チケットのリスト取得
INF: HTTP request is successful for [http://localhost:3000/issues.json] INF: id=30, subject=Test 30, status=新規 ...中略... INF: id=6, subject=Test 06, status=新規 INF: normally finished { "issues": [ ... ], "total_count": 29, "offset": 0, "limit": 25 } # getメソッド引数にパラメータ設定を追加する sUri = 'http://localhost:3000/issues.json' dHeaders = {'X-Redmine-API-Key': '8dc1f63aうんぬんかんぬん'} dParams = {'offset': 0, 'limit': 25} ...略... iTotalCount = dParams['limit'] # 全チケット(Issue)数初期値はlimitとする dIssues = None # 戻り値初期設定 # iTotalCountがoffsetより大きい場合HTTPリクエストを繰り返す while iTotalCount > dParams['offset']: # HTTPリクエスト jIssues = requests.get(sUri, headers=dHeaders, params=dParams) # 取得データを辞書に変更して追加 dIssuesCur = jIssues.json() dIssues['issues'] += dIssuesCur['issues'] # (注)None時の記述を略しています # 全チケット数を取得 iTotalCount = dIssues['total_count'] # 1回目レスポンス結果で正確なチケット数に # offsetのインクリメント dParams['offset'] += dParams['limit'] ... INF: id=[6], subject=[Test 06], status=[新規] INF: id=[4], subject=[Test 04], status=[新規] INF: id=[3], subject=[Test 03], status=[新規] INF: id=[2], subject=[Test 02], status=[新規] INF: id=[1], subject=[Test 01], status=[新規] INF: normally finished チケット(Issue): status_id設定で全ステータスのリスト取得
dParams = {'offset': 0, 'limit': 25, 'status_id': '*'} ...略... jIssues = requests.get(sUri, headers=dHeaders, params=dParams) INF: id=[6], subject=[Test 06], status=[新規] INF: id=[5], subject=[Test 05], status=[終了] INF: id=[4], subject=[Test 04], status=[新規] INF: id=[3], subject=[Test 03], status=[新規] INF: id=[2], subject=[Test 02], status=[新規] INF: id=[1], subject=[Test 01], status=[新規] INF: normally finished チケット(Issue): 指定ID/番号のチケット情報取得
![]() (※)クリックで拡大 import requests import json # Issue 30 の情報をjsonのURLからjournals付きで取得 strUrl = 'http://localhost:3000/issues/30.json' dicHeaders = {'X-Redmine-API-Key': '8dc1f63aうんぬん'} dicParams = {'include': 'journals'} # レスポンス取得(コンテントはjson) resIssue = requests.get(strUrl, headers=dicHeaders, params=dicParams) # ステータスコード表示 print(f"request_status=[{resIssue.status_code}]") # レスポンスコンテントのjsonデータを辞書として取り出し # ※json()はrequestsのメソッド dicIssue = resIssue.json(); # 整形json作成して取得データ全体dump表示(これでkeyとvalueの関係を把握する) jsoIssue = json.dumps(dicIssue, indent=2, ensure_ascii=False) print("=========================================================================") print(jsoIssue) # issue番号とコメント部を表示 print("=========================================================================") print(f"issue_id=[{dicIssue['issue']['id']}]") for journal in dicIssue['issue']['journals']: print(f" journal_id=[{journal['id']}], notes=[{journal['notes']}]") >test_d.py request_status=[200] ========================================================================= { "issue": { "id": 30, ... "subject": "Test 30", "description": "[Test 30]の説明", ... "journals": [ { "id": 5, ... "notes": "ここにまとめ記述予定", ... } ] } } ========================================================================= issue_id=[30] journal_id=[5], notes=[ここにまとめ記述予定] チケット(Issue): コメント(journal)の編集
import requests import json # requests url(journal 5) strUrl = 'http://localhost:3000/journals/5.json' # requests header dicHeaders = { 'X-Redmine-API-Key': '8dc1f63aうんぬん', 'Content-Type': 'application/json' } # 変更データ(dic) dicJournal = { 'journal': { 'notes': "REST APIから変更したコメント" } } # dic->json変換 jsoJournal = json.dumps(dicJournal) # 変更データをput(journal 5) resJournal = requests.put(strUrl, headers=dicHeaders, data=jsoJournal) # ステータス print(f"request_status=[{resJournal.status_code}]") ![]() チケット(Issue): 指定ID/番号にコメント追加
{ 'issue': { 'notes': 'REST APIで追加したコメント' } } import requests import json # requsts url(issue 30) strUrl = 'http://localhost:3000/issues/30.json' # requests header dicHeaders = { 'X-Redmine-API-Key': '8dc1f63aうんぬん', 'Content-Type': 'application/json' } # 追加コメント辞書データ dicData = { 'issue':{ 'notes': 'REST APIで追加したコメント' } } # jsonへ変換(ASCII処理無し) jsoData = json.dumps(dicData) # put request resIssue = requests.put(strUrl, headers=dicHeaders, data=jsoData) print(f"return status_code = {resIssue.status_code}")
チケット(Issue): チケット(Issue)の追加
{ 'issue':{ 'project_id': 1, 'subject': 'Test 31' } } import requests import json strUri = 'http://localhost:3000/issues.json' # issuesのURI dicHeaders = { 'X-Redmine-API-Key': '8dc1f63aうんぬん', 'Content-Type': 'application/json' } # チケットdict dicData = {'issue': {'project_id': 1, 'subject': 'Test 31'} } # jsonへ変換 jsoData = json.dumps(dicData) # REST APIでpost objRet = requests.post(strUri, headers=dicHeaders, data=jsoData) print(f"return status_code = {objRet.status_code}") ![]() チケット(Issue): チケット(Issue)の削除
import requests sUri = 'http://localhost:3000/issues/31.json' # チケット31のURI # ヘッダーdict dHeaders = {'X-Redmine-API-Key': '8dc1f63aうんぬんかんぬん'} # REST APIでdelete objRet = requests.delete(sUri, headers=dHeaders) print(f"return status_code = {objRet.status_code}") ![]() 次回は
| |||
Notes | |||
2025-05-04: 初版 2025-06-08: コードの可読性向上,コメントの修正を追加 Copyright(C) 2025 Altmo
本HPについて | |||
[Prev] [Next] [Top] , Python [Prev] [Next] , [Python Top] |