Python调用Jira REST API返回201但未更新属性,如何修正?
修正Jira REST API更新属性的Python代码
你遇到的核心问题是端点与Payload格式不匹配,同时请求头缺少必要的Content-Type字段:
- 你使用的
/issue/{key}/properties/{propertyKey}端点是用于管理Issue自定义属性(附加在Issue上的键值对,不是自定义字段),但你的Payload用了更新自定义字段的fields嵌套结构,导致Jira创建了一个新的Issue属性而非修改目标字段。 - 状态码201表示Jira成功创建了这个新属性,但这不是你想要的修改操作。
以下分两种场景给出修正方案:
场景1:更新自定义字段(customfield_15035是自定义字段)
如果customfield_15035是Jira后台配置的自定义字段,需使用Issue更新端点而非属性管理端点:
import requests from requests.auth import HTTPBasicAuth import json # 替换为Issue更新端点 URL = 'https://myurl.atlassian.net/rest/api/3/issue/TEST-55?notifyUsers=false' # 保留fields结构,确保字段值格式匹配自定义字段的定义(比如数组/对象结构) payload = json.dumps({ "fields": { "customfield_15035": [{"prop1": "xxxx", "prop2": "yyyy", "prop3": "zzzz"}] } }) # 必须添加Content-Type头,告知服务器请求体为JSON格式 headers = { "Accept": "application/json", "Content-Type": "application/json" } auth = HTTPBasicAuth(user, passw) response = requests.put(URL, headers=headers, auth=auth, data=payload) print(response.status_code) # 打印响应内容便于排查问题 print(json.dumps(json.loads(response.text), indent=2))
场景2:更新Issue自定义属性(非自定义字段)
如果你确实要修改的是Issue的自定义属性(而非系统/自定义字段),则需调整Payload格式,去掉fields嵌套:
import requests from requests.auth import HTTPBasicAuth import json # 保留properties端点 URL = 'https://myurl.atlassian.net/rest/api/3/issue/TEST-55/properties/customfield_15035?notifyUsers=false' # 直接传入属性值,无需fields包裹 payload = json.dumps({ "prop1": "xxxx", "prop2": "yyyy", "prop3": "zzzz" }) # 添加Content-Type头 headers = { "Accept": "application/json", "Content-Type": "application/json" } auth = HTTPBasicAuth(user, passw) response = requests.put(URL, headers=headers, auth=auth, data=payload) print(response.status_code) print(json.dumps(json.loads(response.text), indent=2))
额外排查建议
- 调用Jira的
/rest/api/3/issue/TEST-55GET接口,查看当前Issue的字段和属性结构,确认customfield_15035的实际类型。 - 打印响应内容,Jira会返回详细的错误提示(若存在),帮助定位格式问题。
内容的提问来源于stack exchange,提问作者larx
相关产品推荐
相关产品推荐

