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

使用Python Requests调用Bitbucket REST API创建PR失败求助

问题分析与解决:Requests模块创建Pull Request失败

嘿,这个问题我太熟悉了!你用curl能成功,但用requests失败的核心原因在于你对requests.post的json参数理解错了。

问题根源

当你使用json=json_data的时候,requests会自动把传入的内容序列化成JSON格式。但你这里传入的json_data已经是一个JSON字符串了——这就导致requests会把这个字符串再做一次JSON序列化!简单说,服务器收到的不是一个正常的JSON对象,而是一个被包裹在引号里的JSON字符串。这就难怪Bitbucket的Jackson解析器报错,说没法从字符串实例化RestPullRequest对象了。

而curl能成功,是因为-d参数直接把你写的JSON原封不动发给了服务器,加上Content-Type设置正确,服务器能正常解析。


解决办法1:传入Python字典(推荐)

把你的JSON字符串转换成Python字典,直接传给json参数,requests会帮你正确完成序列化:

import requests
from requests.auth import HTTPBasicAuth

url = 'http://stashdev.blah.com/rest/api/1.0/projects/SAN/repos/joe/pull-requests'
headers = {'content-type': 'application/json'}
# 把JSON字符串转为Python字典
json_data = {
    "title": "Test pull request",
    "description": "Description Here",
    "state": "OPEN",
    "open": True,
    "closed": False,
    "fromRef": {
        "id": "refs/heads/feature",
        "repository": {
            "slug": "joe",
            "name": None,
            "project": {"key": "SAN"}
        }
    },
    "toRef": {
        "id": "refs/heads/master",
        "repository": {
            "slug": "joe",
            "name": None,
            "project": {"key": "SAN"}
        }
    },
    "locked": False,
    "reviewers": [{"user": {"name": "jmsmith"}}]
}
r = requests.post(url, headers=headers, json=json_data, auth=HTTPBasicAuth('devops', 'password'))
# 打印响应结果排查问题
print(r.json())

解决办法2:用data参数传递JSON字符串

如果你坚持要用JSON字符串,那就不要用json参数,改用data参数,同时保持Content-Type的header设置:

import requests
from requests.auth import HTTPBasicAuth

url = 'http://stashdev.blah.com/rest/api/1.0/projects/SAN/repos/joe/pull-requests'
headers = {'content-type': 'application/json'}
json_data = '{"title":"Test pull request","description":"Description Here","state":"OPEN","open":true,"closed":false,"fromRef":{"id":"refs/heads/feature","repository":{"slug":"joe","name":null,"project":{"key":"SAN"}}},"toRef":{"id":"refs/heads/master","repository":{"slug":"joe","name":null,"project":{"key":"SAN"}}},"locked":false,"reviewers":[{"user":{"name":"jmsmith"}}]}'
# 替换为data参数传递字符串
r = requests.post(url, headers=headers, data=json_data, auth=HTTPBasicAuth('devops', 'password'))
print(r.json())

内容的提问来源于stack exchange,提问作者Joe Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:52:32