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

2024-04-20 02:09:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在试用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)

我回来了:HTTP Error 422: Unprocessable Entity没有进一步的信息。我在python方面做错了什么吗?泰铢


其他信息: 我发现问题出在ssh_密钥上。如果我去掉那个元素,一切都会好的。


Tags: nameimageapijsondatasizedebianurllib
2条回答

我收到了同样的错误,并意识到这是由于服务器端验证失败与您的post数据。

解决方案:

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

谢谢:)

为什么要用url编码数据?这不是curl版本所做的。改为转储到JSON:

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

相关问题 更多 >