使用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
相关产品推荐
相关产品推荐

