Do it in stages, and modify the object, like this:
# make a string with the request type in it: method = "POST" # create a handler. you can specify different handlers here (file uploads etc) # but we go for the default handler = urllib2.HTTPHandler() # create an openerdirector instance opener = urllib2.build_opener(handler) # build a request data = urllib.urlencode(dictionary_of_POST_fields_or_None) request = urllib2.Request(url, data=data) # add any other information you want request.add_header("Content-Type",'application/json') # overload the get method function with a small anonymous function... request.get_method = lambda: method # try it; don't forget to catch the result try: connection = opener.open(request) except urllib2.HTTPError,e: connection = e # check. Substitute with appropriate HTTP code. if connection.code == 200: data = connection.read() else: # handle the error case. connection.read() will still contain data # if any was returned, but it probably won't be of any use
This way allows you to extend to making
OPTIONS requests too, simply by substituting the value of method or even wrapping it up in a function. Depending on what you’re trying to do, you may also need a different HTTP handler, e.g. for multi file upload.