|
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] |