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 ?

1
  • Is the https://api.parse.com/1/push endpoint supposed to support POST requests? Commented Feb 6, 2015 at 22:16

3 Answers 3

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.

Sign up to request clarification or add additional context in comments.

2 Comments

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 )
@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)
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.

Comments

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.