Python中的POST请求返回urllib2.HTTPError: HTTP错误400:错误请求
我正在尝试通过Zendesk的核心API创建新的组织。我已经能够顺利进行其他操作,但这个操作一直失败。下面的代码展示了这个问题:
url = "https://mydomain.zendesk.com/api/v2/organizations.json"
new_org = {"organization": {"name": "new organization"}}
data = urllib.urlencode(new_org)
req = urllib2.Request(url,data)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, url, 'me@email.com', 'fakepassword')
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)
urllib2.install_opener(opener)
response = urllib2.urlopen(req)
bla = response.read()
出现了以下错误:
Traceback (most recent call last):
File "/network/nfshome0/homestore00/me/workspace/Pythony/pythony/test2.py", line 35, in <module>
response = urllib2.urlopen(req)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
result = self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 890, in http_error_401
url, req, headers)
File "/usr/lib/python2.7/urllib2.py", line 865, in http_error_auth_reqed
response = self.retry_http_basic_auth(host, req, realm)
File "/usr/lib/python2.7/urllib2.py", line 878, in retry_http_basic_auth
return self.parent.open(req, timeout=req.timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 444, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
任何帮助都会非常感谢!谢谢。
1 个回答
0
你的问题跟使用 urllib.urlencode
有关。正如文档所说,这个函数会:
把一个映射对象或者一系列包含两个元素的元组转换成一个“百分号编码”的字符串。
Zendesk 组织 API 期望在请求的主体中接收到 JSON 数据。如果你的请求格式不对,Zendesk 就无法理解。这就是为什么你会收到 400 状态码的原因。关于状态码的维基百科页面上描述了 400 状态码的意思是:
服务器无法或不愿意处理请求,因为被认为是客户端错误的某些原因(例如,请求语法错误、无效的请求消息格式,或者欺骗性的请求路由)。
虽然你可以通过正确地在请求中包含数据来解决这个问题,比如这样:
req = urllib2.Request(url, json.dumps(new_org))
但如果你使用requests库,真的可以省下很多麻烦。我没有办法访问 Zendesk 来测试这个,但我怀疑你的代码可以改写成:
import requests
new_org = {"organization": {"name": "new organization"}}
response = requests.post(
"https://mydomain.zendesk.com/api/v2/organizations.json",
auth=('me@email.com', 'fakepassword'),
data=new_org
)
data = response.json()