Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > PYTHON HTTP POST

Reply
Thread Tools

PYTHON HTTP POST

 
 
lilanidhaval@gmail.com
Guest
Posts: n/a
 
      01-14-2009
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
 
Reply With Quote
 
 
 
 
koranthala@gmail.com
Guest
Posts: n/a
 
      01-14-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.

(E-Mail Removed) 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

 
Reply With Quote
 
 
 
 
koranthala@gmail.com
Guest
Posts: n/a
 
      01-14-2009
On Jan 14, 2:21*pm, (E-Mail Removed) wrote:
> 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.
>
> (E-Mail Removed) 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

>
>


oops - Forgot to mention that POSTing files mechanism is taken from a
recipe in active state -
http://code.activestate.com/recipes/146306/
 
Reply With Quote
 
dhaval
Guest
Posts: n/a
 
      01-14-2009
The action part of the field is not set to anything.
I need any site with working example that accepts POST.

On Jan 14, 2:21 pm, (E-Mail Removed) wrote:
> 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.
>
> (E-Mail Removed) 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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Http post and http get n3d!m Python 2 02-06-2012 09:18 PM
HTTP SOAP/HTTP GET/HTTP POST milan_9211 Software 0 01-10-2011 02:10 PM
Why getInputStream in a http servlet request isn't getting the datasent by browser HTTP POST action? James Java 3 11-25-2005 11:17 PM
HTTP GET vs HTTP POST protocol serge calderara ASP .Net Web Services 1 11-04-2005 01:27 PM
How to enter to .aspx page by http connection using http POST request farazkazmi@gmail.com Java 6 08-29-2005 02:58 PM



Advertisments