Easy way to do a HTTPS POST?

G

gregarican

For a business banking app I needed to script out something that would
upload a PGP-encrypted text file through a HTTPS POST command. Since
Ruby is my language of choice for quick hitters like this I looked into
using it for the HTTPS POST part of the puzzle. After googling around
for awhile I didn't run across anything blatantly obvious as a
solution.

I use the One-Click Installer for Windows version of Ruby 1.8.4 as my
primary development tool. I only saw 'net/http' and not 'net/https' as
valid choices...
 
G

Gabriele Marrone

For a business banking app I needed to script out something that would
upload a PGP-encrypted text file through a HTTPS POST command. Since
Ruby is my language of choice for quick hitters like this I looked
into
using it for the HTTPS POST part of the puzzle. After googling around
for awhile I didn't run across anything blatantly obvious as a
solution.

I use the One-Click Installer for Windows version of Ruby 1.8.4 as my
primary development tool. I only saw 'net/http' and not 'net/https' as
valid choices...

Net::HTTP does the job.
You can see examples on http://www.ruby-doc.org/stdlib/libdoc/net/
http/rdoc/classes/Net/HTTP.html , I'm copypasting here the POST ones:

require 'net/http'
require 'uri'

#1: Simple POST
res = Net::HTTP.post_form(URI.parse('http://www.example.com/
search.cgi'),
{'q'=>'ruby', 'max'=>'50'})
puts res.body

#2: POST with basic authentication
res = Net::HTTP.post_form(URI.parse('http://
jack:p[email protected]/todo.cgi'),
{'from'=>'2005-01-01',
'to'=>'2005-03-31'})
puts res.body

#3: Detailed control
url = URI.parse('http://www.example.com/todo.cgi')
req = Net::HTTP::post.new(url.path)
req.basic_auth 'jack', 'pass'
req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end

If you need HTTPS make sure to require 'net/https' and use something
like this:

#3: Detailed control
url = URI.parse('http://www.example.com/todo.cgi')
req = Net::HTTP::post.new(url.path)
req.basic_auth 'jack', 'pass'
req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
http = Net::HTTP.new(url.host, url.port) # lines
http.use_ssl = true # modified
res = http.start {|http| http.request(req) } # by me
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end

I didn't actually test this code but I think it should work.

By the way, it doesn't support cookies as far as I know.
In fact I needed a library with which I could interact with a website
that needed a session id stored in a cookie (and not encoded within
the URL) and I wasn't able to find any. :(
 
G

Gabriele Marrone

By the way, it doesn't support cookies as far as I know.

Oops! As soon as I posted, I found an example about using cookies
with Net::HTTP...
Ok, nevermind :)
 
G

gregarican

Gotcha. I guess since most of the API docs just had HTTP examples I
assumed that 'net/http' didn't support HTTPS. Since it does this should
be a snap. Thanks for the quick replies!
 
A

Aaron Patterson

Net::HTTP does the job.
You can see examples on http://www.ruby-doc.org/stdlib/libdoc/net/
http/rdoc/classes/Net/HTTP.html , I'm copypasting here the POST ones:

require 'net/http'
require 'uri'

#1: Simple POST
res = Net::HTTP.post_form(URI.parse('http://www.example.com/
search.cgi'),
{'q'=>'ruby', 'max'=>'50'})
puts res.body

#2: POST with basic authentication
res = Net::HTTP.post_form(URI.parse('http://
jack:p[email protected]/todo.cgi'),
{'from'=>'2005-01-01',
'to'=>'2005-03-31'})
puts res.body

#3: Detailed control
url = URI.parse('http://www.example.com/todo.cgi')
req = Net::HTTP::post.new(url.path)
req.basic_auth 'jack', 'pass'
req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end

If you need HTTPS make sure to require 'net/https' and use something
like this:

#3: Detailed control
url = URI.parse('http://www.example.com/todo.cgi')
req = Net::HTTP::post.new(url.path)
req.basic_auth 'jack', 'pass'
req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
http = Net::HTTP.new(url.host, url.port) # lines
http.use_ssl = true # modified
res = http.start {|http| http.request(req) } # by me
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end

I didn't actually test this code but I think it should work.

By the way, it doesn't support cookies as far as I know.
In fact I needed a library with which I could interact with a website
that needed a session id stored in a cookie (and not encoded within
the URL) and I wasn't able to find any. :(

Try Mechanize. It will handle redirects and cookies for you. It will
also post http/https forms.

http://mechanize.rubyforge.org/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top