使用Python Jira API转换工单状态时遇HTTP 400错误求助
问题:Python Jira API修改工单状态为Resolved并标记Declined时触发HTTP 400错误
手动在Web端可正常将Jira工单状态改为Resolved并标记Declined,但通过Python Jira API执行对应操作时触发HTTP 400错误,提示“无法移动工单(VUESS-765)。您可能没有权限,或者工单缺少必要信息。若问题持续,请联系Jira管理员”,尝试多种resolution参数形式仍未解决。
提供的代码
def decline_issue_status(self, firing_issue: Issue, resolved_issue: Issue): status: Status = firing_issue.get_field("status") if status.id in ('10004','10019','10008'): self.add_label_for_grafana(firing_issue,resolved_issue) self.client.transition_issue(firing_issue,transition='71',resolution = {"id": "6","name": "Done"}, comment="Done") #resolution = {"id": "5","name": "Обработано"} print(status)
报错信息
File "/home/fife/app/python/to_move_project/epm-sdl1/apps/schedule/jira_job_processing.py", line 105, in decline_issue_status self.client.transition_issue(firing_issue,transition='71',resolution = {"id": "6","name": "Done"}, comment="Done") #resolution = {"id": "5","name": "Обработано"} File "/home/fife/app/python/project/epmc-acm30-ticket-triage-engine/venv/lib/python3.10/site-packages/jira/client.py", line 123, in wrapper result = func(*arg_list, **kwargs) File "/home/fife/app/python/project/epmc-acm30-ticket-triage-engine/venv/lib/python3.10/site-packages/jira/client.py", line 2217, in transition_issue r = self._session.post(url, data=json.dumps(data)) File "/home/fife/app/python/project/epmc-acm30-ticket-triage-engine/venv/lib/python3.10/site-packages/requests/sessions.py", line 637, in post return self.request("POST", url, data=data, json=json, **kwargs) File "/home/fife/app/python/project/epmc-acm30-ticket-triage-engine/venv/lib/python3.10/site-packages/jira/resilientsession.py", line 246, in request elif raise_on_error(response, **processed_kwargs): File "/home/fife/app/python/project/epmc-acm30-ticket-triage-engine/venv/lib/python3.10/site-packages/jira/resilientsession.py", line 71, in raise_on_error raise JIRAError( jira.exceptions.JIRAError: JiraError HTTP 400 url: https://epamservicedesk-sandbox-161.atlassian.net/rest/api/2/issue/VUESS-765/transitions text: 无法移动工单(VUESS-765)。您可能没有权限,或者工单缺少必要信息。若问题持续,请联系Jira管理员。 response headers = {'Date': 'Tue, 23 Jan 2024 10:16:43 GMT', 'Content-Type': 'application/json;charset=UTF-8', 'Server': 'AtlassianEdge', 'Timing-Allow-Origin': '*', 'X-Arequestid': '32a3e2ead7a8048cf9e9e40927080c61', 'X-Aaccountid': '712020%3A34dba71e-5d38-450a-ab31-af25a7bbe9d0', 'Cache-Control': 'no-store, no-cache', 'X-Content-Type-Options': 'nosniff', 'X-Xss-Protection': '1; mode=block', 'Atl-Traceid': 'e1e41298def640af86b37a8a42056bad', 'Report-To': '{"endpoints": [{"url": "https://dz8aopenkvv6s.cloudfront.net"}], "group": "endpoint-1", "include_subdomains": true, "max_age": 600}', 'Nel': '{"failure_fraction": 0.001, "include_subdomains": true, "max_age": 600, "report_to": "endpoint-1"}', 'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked'} response text = {"errorMessages":["无法移动工单(VUESS-765)。您可能没有权限,或者工单缺少必要信息。若问题持续,请联系Jira管理员。"],"errors":{}}
请求JSON
{"transition": {"id": 71}, "update": {"comment": [{"add": {"body": "Done"}}]}, "fields": {"resolution": {"id": "6", "name": "Done"}}}
解决方法
- 核对Resolution参数:你要标记的是Declined,但当前代码传递的是Done的resolution id(6),注释里的
{"id": "5","name": "Обработано"}才是对应Declined的选项,替换这个参数试试。 - 检查Transition ID的类型:Jira的Transition ID通常是字符串类型,请求中当前是数字71,尝试将代码中的
transition='71'保持字符串,或者确认该Transition ID是否正确(可通过Web端查看状态转换的URL获取正确ID)。 - 确认Transition的必填字段:有些状态转换需要填写特定字段,Web端可能自动填充,但API调用时需要手动传入。调用
GET /rest/api/2/issue/VUESS-765/transitions?expand=transitions.fields接口,查看ID为71的Transition需要哪些必填字段,在API请求中补充这些字段。 - 调整参数传递方式:Python Jira库的
transition_issue方法中,resolution参数可能需要放在fields字典中传递,而不是单独作为参数。尝试修改调用方式:self.client.transition_issue( firing_issue, transition='71', fields={"resolution": {"id": "5"}}, # 使用Declined对应的ID comment="Done" ) - 验证权限一致性:确保API使用的账号和你手动操作的账号权限完全一致,包括项目权限、状态转换权限等。
内容的提问来源于stack exchange,提问作者Sasha Corn
相关产品推荐
相关产品推荐

