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

HTTP错误422:不可处理的实体-从Python调用API时(但curl有效),python,curl,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-Typ

在试用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"
效果很好,液滴就形成了


现在,当我使用以下命令从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)
我返回:
httperror 422:Unprocessable Entity
,没有进一步的信息。我在python方面做错了什么吗?Thx


其他信息:
我发现问题一定出在ssh_密钥上。如果我删除该元素,一切正常。

为什么要对数据进行url编码?这不是curl版本所做的。将其转储到JSON:

data = json.dumps(json_values)
req = urllib.request.Request(create_droplets_url, data)

我收到了相同的错误,并意识到这是由于服务器端验证失败而导致的

解决方案:

使用
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=(",", ": ")))

谢谢:)

然后我得到了:TypeError:POST数据应该是字节或字节数。它不能是str类型。