尝试使用digitalocean v2 api时,我遇到以下行为:
curl -X POST "https://api.digitalocean.com/v2/droplets" \
-d'{"name":"t002","region":"ams3","size":"512mb","image":"debian-7-0-x64","ssh_keys":[123]}' \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"
正常工作,并创建了Droplet。
现在当我从python中调用它时:
json_values = {'name': 's002', 'region': 'ams3', 'size': '512mb', 'image': 'debian-7-0-x64', 'ssh_keys': [123]}
data = urllib.parse.urlencode(json_values)
data = data.encode("utf-8")
try:
req = urllib.request.Request(create_droplets_url, data)
req.add_header("User-Agent", uagent) # set custom user agent
req.add_header("Authorization", BearerToken) # set custom user agent
response = urllib.request.urlopen(req)
我回来了:HTTP Error 422: Unprocessable Entity
没有进一步的信息。我在python方面做错了吗? THX
其他信息: 我发现问题必须与ssh_keys有关。如果我删除该元素一切正常。
答案 0 :(得分:3)
为什么要对数据进行网址编码?这不是curl版本正在做的事情。转而将其转储为JSON:
data = json.dumps(json_values)
req = urllib.request.Request(create_droplets_url, data)
答案 1 :(得分:0)
我收到了相同的错误,并且意识到由于服务器端验证失败,并且您的帖子数据已发生。
解决方案:
使用requests.post
而不是urllib.request.Request
,则可以获取该服务器端422
错误代码的准确错误消息。
示例代码:
import requests
API_URL = "***"
TOKEN = "***"
HEADERS = {
"User-Agent": "Python API Sample",
"Authorization": "Bearer " + TOKEN,
"Content-Type": "application/json"
}
data = {
"user_id": "***",
"project_id": "***"
}
json_data = json.dumps(data).encode('utf8')
response = requests.post(url=API_URL, headers=HEADERS, data=json_data)
print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")))
谢谢:)