HTTP错误422:不可处理的实体-从Python调用API时(但curl有效)
在试用digitalocean v2 api时,我遇到了以下行为: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
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类型。