Python中的POST请求返回urllib2.HTTPError:HTTP错误400:Bad请求

Python中的POST请求返回urllib2.HTTPError:HTTP错误400:Bad请求,python,zendesk,Python,Zendesk,我正在尝试使用Zendesk的核心API在Zendesk中创建新的组织。我已经能够毫无问题地拨打其他电话,但这一次仍然失败。以下代码演示了该问题: url = "https://mydomain.zendesk.com/api/v2/organizations.json" new_org = {"organization": {"name": "new organization"}} data = urllib.urlencode(new_org) req = urllib2.Request(u

我正在尝试使用Zendesk的核心API在Zendesk中创建新的组织。我已经能够毫无问题地拨打其他电话,但这一次仍然失败。以下代码演示了该问题:

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
回溯(最近一次呼叫最后一次):
文件“/network/nfshome0/homestore00/me/workspace/Pythony/Pythony/test2.py”,第35行,在
响应=urllib2.urlopen(请求)
文件“/usr/lib/python2.7/urllib2.py”,第126行,在urlopen中
return\u opener.open(url、数据、超时)
文件“/usr/lib/python2.7/urllib2.py”,第406行,打开
响应=方法(请求,响应)
http_响应中的文件“/usr/lib/python2.7/urllib2.py”,第519行
“http”、请求、响应、代码、消息、hdrs)
文件“/usr/lib/python2.7/urllib2.py”,第438行出错
结果=自身调用链(*args)
文件“/usr/lib/python2.7/urllib2.py”,第378行,在调用链中
结果=func(*args)
http\u error\u 401中的文件“/usr/lib/python2.7/urllib2.py”,第890行
url、请求、标题)
文件“/usr/lib/python2.7/urllib2.py”,第865行,http\u error\u auth\u requed
response=self.retry\u http\u basic\u auth(主机、请求、领域)
文件“/usr/lib/python2.7/urllib2.py”,第878行,在retry\u http\u basic\u auth中
返回self.parent.open(请求,超时=请求超时)
文件“/usr/lib/python2.7/urllib2.py”,第406行,打开
响应=方法(请求,响应)
http_响应中的文件“/usr/lib/python2.7/urllib2.py”,第519行
“http”、请求、响应、代码、消息、hdrs)
文件“/usr/lib/python2.7/urllib2.py”,第444行出错
返回自我。调用链(*args)
文件“/usr/lib/python2.7/urllib2.py”,第378行,在调用链中
结果=func(*args)
文件“/usr/lib/python2.7/urllib2.py”,第527行,默认为http\u error\u
raise HTTPError(请求获取完整url(),代码,消息,hdrs,fp)
urllib2.HTTPError:HTTP错误400:错误请求

任何帮助都将不胜感激!谢谢。

您的问题与使用
urllib.urlencode
有关。如图所示,这将:

将映射对象或两个元素元组序列转换为“百分比编码”字符串

希望接收JSON数据作为请求主体。Zendesk无法理解您的请求,因为它的格式错误。返回的400状态代码表明了这一点。on状态代码将400状态代码描述为:

由于被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求

现在,您可以通过如下方式在请求中正确包含数据来解决此问题:

req = urllib2.Request(url, json.dumps(new_org))
如果你使用这个库,你真的会节省很多精力。我无法访问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()
使用以下工具有助于: