You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误通常会返回具体的字段问题,比如:
    print(response.status_code)
    print(response.text)
    
    这个错误信息能直接告诉你是哪个字段出问题,比瞎猜高效10倍。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:33