You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改Python脚本处理Jira响应,让外部程序拆分Issue事件?

解决Jira响应JSON拆分问题:让外部程序识别单个Issue事件

你现在遇到的问题很明确——Jira返回的是包含顶级元数据的完整JSON对象,而外部程序需要的是独立的Issue事件。核心解决思路就是剥离掉expandstartAt这些顶级字段,只提取并发送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

火山引擎 最新活动