PYTHON HTTP POST
koranthala at gmail.com
koranthala at gmail.com
Wed Jan 14 04:21:58 EST 2009
Does google accept POST?
Anyways, if you dont need to post files, you can use urlencode itself.
def encode_formdata(fields):
body = urllib.urlencode(dict(<fields>))
content_type = "application/x-www-form-urlencoded"
return content_type, body
If you need to post files too, then you will have to use multipart
data
def encode_multipart_formdata(fields, files):
"""
fields is a sequence of (name, value) elements for regular form
fields.
files is a sequence of (name, filename, value) elements for data
to be uploaded as files
Return (content_type, body) ready for httplib.HTTP instance
"""
BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
CRLF = '\r\n'
L = []
for (key, value) in fields:
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s"' % key)
L.append('')
L.append(value)
for (key, filename, value) in files:
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s";
filename="%s"' % (key, filename))
L.append('Content-Type: %s' % mimetypes.guess_type(filename)
[0] or 'application/octet-stream'
L.append('')
L.append(value)
L.append('--' + BOUNDARY + '--')
L.append('')
body = CRLF.join(L)
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
return content_type, body
Since POST files doesnt work with urllib, you might have to use
httplib - or go for very high level tools like twisted.
I here show an example with httplib.
def post(host, selector, fields, files):
if files:
content_type, body = encode_multipart_formdata(fields, files)
else:
content_type, body = encode_formdata(fields)
h = httplib.HTTPConnection(host)
#Spoof Mozilla
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4',
'Content-Type': content_type
}
h.request('POST', selector, body, headers)
res = h.getresponse()
return res.status, res.reason, res.read()
Please note that you can use multipart whether or not files are there,
but parsing multipart usually is slower.
Hope this helps.
lilanidha... at gmail.com wrote:
> Hi,
>
> I need one complete example of how to do a http post to any site.
> I have tried making a POST to google but all I am returned with is a
> 405 error.
> I don't want to use Pygoogle as I want to try and do this with other
> sites.
> I am also having problems inputing with the param
> I have tried Mechanize. There are no problems with getting data only
> posting.
>
> >>> headers = {'Content-Type': 'text/html; charset=ISO-8859-1',
> ... 'User-Agent':'Mozilla/4.0',
> ... 'Content-Length':'7'}
> >>> conn = httplib.HTTPConnection("www.google.com")
> >>> conn.request("POST","/search",params,headers)
> >>> r2 = conn.getresponse()
> >>> print r2.status, r2.reason
> 405 Method Not Allowed
>
> Regards,
> Dhaval
More information about the Python-list
mailing list