Jira Atlassian API 分页

问题描述 投票:0回答:2

我已经使用过 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 个结果。

谢谢

powerbi jira jira-rest-api jira-rest-java-api
2个回答
2
投票

您需要发出多个 REST 请求来迭代所有结果一次一个“页面”

  1. 从 JIRA 读取 API 响应并捕获响应中
    maxResults
    startAt
    的值。
  2. maxResults
    的值添加到
    startAt
    ,更新您的 REST API 调用
    startAt
    参数,然后再次调用相同的 API 端点。
  3. 重复,直到
    startAt
    大于或等于
    total
    ,或直到
    isLast
    为真。

while
循环非常适合这样的操作。为了最大限度地减少 API 调用,您应该为
maxResults
使用较大的值,以便在每个循环中收到更多数据。


0
投票

下面是示例 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)
© www.soinside.com 2019 - 2024. All rights reserved.