如何修改Python脚本处理Jira响应,让外部程序拆分Issue事件?
解决Jira响应JSON拆分问题:让外部程序识别单个Issue事件
你现在遇到的问题很明确——Jira返回的是包含顶级元数据的完整JSON对象,而外部程序需要的是独立的Issue事件。核心解决思路就是剥离掉expand、startAt这些顶级字段,只提取并发送issues数组里的内容。
下面给你两种具体的实现方式,你可以根据外部程序的接收要求来选:
方案1:逐个发送单个Issue(推荐,适配大多数事件型系统)
如果外部程序需要每次接收一个独立的Issue JSON,就遍历issues数组逐个发送:
import requests import json class BearerAuth2(requests.auth.AuthBase): def __init__(self, token): self.token = token def __call__(self, s): s.headers["authorization"] = "tok" + self.token return s from requests.auth import HTTPBasicAuth headers={'content-type': 'application/json'} jira_auth = HTTPBasicAuth('username', 'password') external_auth = BearerAuth2('token') external_url = 'https://http-inputs-externalprogram' # 封装Jira请求逻辑,方便复用 def fetch_jira_issues(start_at, max_results): url = 'https://ourdomain/rest/api/2/search' params = { 'jql': '"Delivery Team" is not EMPTY', 'fields': 'comment, summary, customfield_10004, customfield_12802, body, assignee, Key', 'maxResults': max_results, 'startAt': start_at } res = requests.get(url, params=params, headers=headers, auth=jira_auth) res.raise_for_status() # 自动抛出请求错误,方便排查问题 return res.json() # 获取两次请求的issues数据 payload2 = fetch_jira_issues(0, 50) payload3 = fetch_jira_issues(1001, 1000) all_issues = payload2['issues'] + payload3['issues'] # 逐个发送每个Issue for issue in all_issues: # 只发送单个Issue的JSON,不带Jira返回的顶级字段 send_res = requests.post( external_url, data=json.dumps(issue), headers=headers, auth=external_auth ) # 可选:打印发送状态,方便调试 issue_key = issue.get('key', 'unknown') if send_res.ok: print(f"Issue {issue_key} sent successfully!") else: print(f"Failed to send {issue_key} - Status: {send_res.status_code}")
方案2:批量发送整个Issues数组
如果外部程序支持接收JSON数组并自动拆分每个元素,直接发送issues数组即可:
# ...(前面的Auth类、请求逻辑和方案1一致) # 合并所有issues数据 all_issues = payload2['issues'] + payload3['issues'] # 把数组转成JSON发送给外部程序 send_res = requests.post( external_url, data=json.dumps(all_issues), headers=headers, auth=external_auth )
额外优化:自动分页获取所有Issue
你现在手动写了两次请求,其实可以用循环自动处理分页,不用手动计算startAt,适配所有总数的Issue:
def fetch_all_jira_issues(): base_url = 'https://ourdomain/rest/api/2/search' params = { 'jql': '"Delivery Team" is not EMPTY', 'fields': 'comment, summary, customfield_10004, customfield_12802, body, assignee, Key', 'maxResults': 1000, # Jira允许的最大单次请求数量 'startAt': 0 } all_issues = [] while True: res = requests.get(base_url, params=params, headers=headers, auth=jira_auth) res.raise_for_status() data = res.json() all_issues.extend(data['issues']) # 判断是否还有更多数据需要获取 if data['startAt'] + data['maxResults'] >= data['total']: break params['startAt'] += data['maxResults'] return all_issues # 调用这个函数就能拿到所有1253个Issue all_issues = fetch_all_jira_issues()
这样不管Jira里的Issue总数怎么变,代码都能自动获取全部数据,不用手动调整请求参数啦。
内容的提问来源于stack exchange,提问作者FreshX




