【问题标题】:urllib2.HTTPError: HTTP Error 400: Bad Request - Pythonurllib2.HTTPError:HTTP 错误 400:错误请求 - Python
【发布时间】:2015-02-06 22:09:31
【问题描述】:

我正在尝试使用 urllib 和 urllib2 发布,但它一直给我这个错误

    Traceback (most recent call last):
  File "/Users/BaDRaN/Desktop/untitled text.py", line 39, in <module>
    response = urllib2.urlopen(request)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request

这是我的代码

body    = {'where' : {'deviceType' : 'ios'}, 'data' : {'alert' : 'vvv'}}
headers = { 'X-Parse-Application-Id' : 'someID', 'X-Parse-REST-API-Key' : 'someKey', 'Content-Type' : 'application/json' }

data     = urllib.urlencode(body)
request  = urllib2.Request('https://api.parse.com/1/push', data, headers)
response = urllib2.urlopen(request)
call     = response.read()

有人可以帮我吗?

【问题讨论】:

  • https://api.parse.com/1/push 端点是否应该支持 POST 请求?

标签: python urllib2 urllib


【解决方案1】:

我的通灵能力建议您希望将body 作为 json 字符串发送,而不是作为转换为字符串的字典发送。

body = '{"where" : {"deviceType" : "ios"}, "data" : {"alert" : "vvv"}}'

注意对 json 元素使用双引号。

【讨论】:

  • 这实际上对我有用。但现在我正在尝试这样做:body = {"where" : {"deviceType" : "ios"}, "data" : {"alert" : "%s"}}' % text 它再次给了我同样的错误。 (文本编码为 utf-8)
  • @BaderAl-Rasheed - 您不能将 Python 字典作为 HTTP 调用的数据参数传递并期望它序列化为正确的 JSON。它不是那样工作的。相反,将您的字典转换为字符串 ala json.dumps(body)
【解决方案2】:

我怀疑您的有效负载编码不正确。他们没有说“urlencoded”。尝试使用他们自己的示例。 https://parse.com/docs/rest#push urrlib2 是一个相当原始的库 - 使用例如请求会更方便。

【讨论】:

    【解决方案3】:

    这取决于json数据的格式是否正确,或者问题出在标题内容中。因此urllib2.HTTPError: HTTP Error 400: Bad Request 通常会出现。

    下面的一小段代码带有用于 PUT/POST 方法的标头和 json 数据的 basic64 身份验证:

    import urllib2
    import base64
    import json
    url = 'Your_URL'
    auth = 'Basic ' + base64.encodestring('%s:%s' % ('username','password'))[:-1]
    content_header = {'Authorization': auth,
                     'Content-Type':'application/json',
                     'Accept':'application/json'}
    json_data = YOUR_DATA
    request = urllib2.Request(url=url, data=json.dumps(json_data), headers=content_header)
    request.get_method = lambda: 'PUT' #If you will not provide this, then it will be POST
    response = urllib2.urlopen(request)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多