Python调用Jira REST API的POST/PUT请求返回400错误求助
嘿,这个问题我之前帮同事排查过类似的,结合你说的情况——GET请求一切正常,但用Python 2.7的requests发POST/PUT就返回400,PowerShell却能成功,大概率是请求细节没和PowerShell的请求对齐,咱们一步步捋:
可能的原因及排查解决步骤
1. 请求体的序列化与Content-Type问题
PowerShell的Invoke-WebRequest处理JSON时会自动帮你做很多事:比如自动设置Content-Type: application/json,甚至对序列化格式的容错性更高。但Python 2.7的requests如果没处理好,很容易踩坑:
- 别直接把字典丢进
data参数!要么用json参数(只要你的requests版本是2.4.2+,Python 2.7是支持的),它会自动帮你序列化并设置正确的Content-Type;要么手动用json.dumps()序列化后传data,同时显式指定头部。 - 给你个正确的示例:
import requests import json url = "https://你的Jira实例地址/jira/rest/api/latest/issue/" headers = { "Content-Type": "application/json", "Authorization": "Basic 你的Base64编码凭证" # 或者用其他认证方式 } payload = { "fields": { "project": {"key": "PROJ"}, "summary": "测试工单", "description": "通过Python创建", "issuetype": {"name": "任务"} } } # 方式1:推荐用json参数(自动处理序列化和头部) response = requests.post(url, headers=headers, json=payload) # 方式2:手动序列化(适配极旧版requests) # response = requests.post(url, headers=headers, data=json.dumps(payload)) - 额外提醒:如果payload里有非ASCII字符(比如中文),Python 2.7的
json.dumps()要加ensure_ascii=False,不然会转成Unicode转义序列,Jira可能不认导致400。
2. 认证方式的细微差异
虽然GET请求正常,但POST/PUT可能对认证的细节要求更严?比如PowerShell用了NTLM认证,而Python用了Basic认证?
- 如果你的Jira用的是NTLM认证,Python 2.7需要额外装
requests_ntlm库,然后这么写:from requests_ntlm import HttpNtlmAuth response = requests.post( url, auth=HttpNtlmAuth('域\\用户名', '密码'), json=payload ) - 权限方面应该没问题(毕竟PowerShell能成),但可以再核对下Jira项目的创建/编辑权限是否给足。
3. 请求头部的遗漏或差异
抓包对比Python和PowerShell的请求头,看看有没有漏掉关键字段:
- 比如PowerShell会自动带
User-Agent,而Python的requests默认UA可能被Jira的WAF拦截?试着在headers里加上和PowerShell一样的User-Agent:headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" - 另外,显式加上
Accept: application/json头部,Jira对POST/PUT的Accept要求可能比GET更严格。
4. 字段格式的严格性问题
Jira API对字段格式要求极严,PowerShell可能自动帮你转换了类型(比如把数字转成字符串),但Python的字典里类型不对就会报错:
- 把PowerShell的请求体和Python的payload逐字段对比,确保每个字段的类型、取值完全一致(比如自定义字段是数字类型,就别传字符串)。
- 最关键的一步:打印Python请求返回的错误详情!400错误通常会返回具体的字段问题,比如:
这个错误信息能直接告诉你是哪个字段出问题,比瞎猜高效10倍。print(response.status_code) print(response.text)
5. Python 2.7的编码坑
Python 2.7的字符串编码是老生常谈的问题,如果payload里有特殊字符,很容易出问题:
- 尽量用Unicode字符串(加
u前缀),比如u"中文描述"; - 手动序列化时记得转成UTF-8编码:
data = json.dumps(payload, ensure_ascii=False).encode('utf-8') response = requests.post(url, headers=headers, data=data)
内容的提问来源于stack exchange,提问作者Minothor
相关产品推荐
相关产品推荐

