HTTP错误422:不可处理的实体 - 从Python调用API(但curl工作)

时间:2014-11-15 19:01:43

标签: python curl

尝试使用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有关。如果我删除该元素一切正常。

2 个答案:

答案 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=(",", ": ")))

谢谢:)