0

I'm trying to POST using urllib and urllib2 but it keeps giving me this error

    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

and here's my code

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()

Anyone could help me here ?

Bader Al-Rasheed
  • 458
  • 1
  • 7
  • 13

3 Answers3

3

My psychic powers suggest you want to send body as a string of json, not as a dictionary that's converted to a string.

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

Notice the use of double-quotes for the json elements.

selbie
  • 100,020
  • 15
  • 103
  • 173
  • that actually worked for me. But now i'm trying to do this: `body = {"where" : {"deviceType" : "ios"}, "data" : {"alert" : "%s"}}' % text` and it is giving me the same error again. ( text is encoded to utf-8 ) – Bader Al-Rasheed Feb 06 '15 at 23:41
  • 1
    @BaderAl-Rasheed - you can't pass a Python dictionary as the data parameter for an HTTP call and expect it to serialize as proper JSON. It doesn't work that way. Instead, convert your dictionary to string ala `json.dumps(body)` – selbie Feb 07 '15 at 00:13
0

I suspect your payload is not correctly encoded. Nowhere they say "urlencoded". Try using their own example instead. https://parse.com/docs/rest#push urrlib2 is a rather primitive library - using e.g. requests would be more convenient.

deets
  • 6,285
  • 29
  • 28
0

It depends whether the json data is in correct format or not, or the issue is in the header content. Hence the urllib2.HTTPError: HTTP Error 400: Bad Request usually occurs.

A small piece of code below with the basic64 authentication with the headers and the json data for the PUT/POST methods:

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)
Pranjay Kaparuwan
  • 881
  • 1
  • 11
  • 17