我已经使用过 JIRA API 几次,但仅适用于小型提取,因此我从未使用分页来返回比最大结果更多的结果。
以下是 API 的文档:https://developer.atlassian.com/cloud/jira/platform/rest/v3/#expansion
我有一个API查询:
let
Source = Json.Document(Web.Contents("*connection URL*,
[Headers=[Accept="application/json"]])),
#"Converted to Table" = Table.FromRecords({Source}),
>Expand the scheme, and define the field data types etc
in
#"Changed Type"
我可以从文档中看到我需要使用这样的东西:
{
"startAt" : 0,
"maxResults" : 10,
"total": 200,
"isLast": false,
"values": [
{ /* result 0 */ },
{ /* result 1 */ },
{ /* result 2 */ }
]
}
我不确定分页适合在哪里?有人可以帮助我吗?我需要返回 1500 个结果。
谢谢
您需要发出多个 REST 请求来迭代所有结果一次一个“页面”:
maxResults
和 startAt
的值。maxResults
的值添加到 startAt
,更新您的 REST API 调用 startAt
参数,然后再次调用相同的 API 端点。startAt
大于或等于 total
,或直到 isLast
为真。while
循环非常适合这样的操作。为了最大限度地减少 API 调用,您应该为 maxResults
使用较大的值,以便在每个循环中收到更多数据。
下面是示例 python 脚本,用于调用 JQL Filter API 并循环分页结果。
每个列表调用返回三个字段
'startAt': 0, 'maxResults': 50, 'total': 141,
您必须调用API,直到达到总数。
import json
import requests
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization" : "Bearer Personal-access-token"
}
BASE_URL = 'https://my.company.com'
jql_url = f'{BASE_URL}/rest/api/latest/search'
query = {
'jql' : 'Your JQL Filter query',
'startAt' : 0,
}
def my_operation_function(issue_data):
issue_key = issue_data['key']
issue_fields = issue_data['fields']
print(f'issue_key\t:\t{issue_key}')
response = requests.request("GET", jql_url, headers=headers, params=query)
data=json.loads(response.text)
'''
>>> data
{'expand': 'schema,names', 'startAt': 0, 'maxResults': 50, 'total': 141, 'issues': [{'expand': 'operations,versionedRepresentations,editmeta,changelog,renderedFields', 'id': '27825703', 'self': 'https://myjira.site.com/rest/api/latest/issue/27825703', 'key': 'ABC-123', 'fields': {'customfield_21400': None, 'customfield_19200': None, 'customfield_18111': None, 'customfield_19201': None, 'customfield_18112': None, 'customfield_18113': None, 'customfield_19202': None, 'customfield_19203': None, 'customfield_18114': None, 'customfield_18110': None,
'''
issues=data['issues']
for issue in issues:
find_keywords(issue)
while query['startAt'] < data['total']:
query['startAt'] += 50
print(f"\nstartAt = {query['startAt']}")
response = requests.request("GET", jql_url, headers=headers, params=query)
data = json.loads(response.text)
issues=data['issues']
for issue in issues:
my_operation_function(issue)