使用urllib2发送JSON POST会导致HTTP 422

问题描述 投票:1回答:2

我一直在向API发送JSON请求时遇到问题。虽然API仍然使用HTTP 422响应,但我添加了应用程序类型标头.JSON文件数据有效,通过jsonlint检查。

post_config = urllib2.Request(config_url)
post_config.add_header('AUTHORIZATION', 'Token token=hash')
post_config.add_header('Content-Type', 'application/json')
post_data = json.dumps(post_data)
print post_data
>>{"type": "numeric", "instance_id": "e0140", "name": "name0140", "uid": "970ebb1b2549b4dd5254", "instance_type": "Recommended", "power": "high"}
send = urllib2.urlopen(post_config, post_data)

结果是:

File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 558, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 422: Unprocessable Entity
python
2个回答
0
投票

尝试使用请求模块,看看你是否仍然得到相同的响应。

Snippet example on how to POST the payload to a REST endpoint

import requests
import json

url = 'http://example.com/endpoint'
headers = {'Content-type': 'application/json'}
data = json.dumps(post_data)
print(data)
r = requests.post(url, data=json.dumps(payload),headers=headers)
print(r.status_code)

0
投票

类似的答案与Mohamed Ashmawy的答案有关;

我收到了同样的错误,并意识到它已经发生,因为服务器端验证失败了你的帖子数据。

解:

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

谢谢 :)

© www.soinside.com 2019 - 2024. All rights reserved.