# Easy way to do a HTTPS POST?

**URL:** <https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583>\
**Category:** Ruby\
**Created:** [November 11, 2006, 2:06am UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583 "2006-11-11T02:06:02Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![gregarican](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/7feea3/32.png) [@gregarican](https://www.ruby-forum.com/u/gregarican)\
**Post date:** [November 11, 2006, 2:06am UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583/1 "2006-11-11T02:06:02Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![gregarican](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/7feea3/32.png) [@gregarican](https://www.ruby-forum.com/u/gregarican)\
**Post date:** [November 11, 2006, 2:28am UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583/2 "2006-11-11T02:28:08Z")

</div>

On 11/nov/06, at 02:05, gregarican wrote:

> valid choices…  
> Net::HTTP does the job.  
> You can see examples on [http://www.ruby-doc.org/stdlib/libdoc/net/](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:removed\_email\_address@domain.invalid/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. ☹

---

<div class="post-metadata">

**Author:** ![gregarican](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/7feea3/32.png) [@gregarican](https://www.ruby-forum.com/u/gregarican)\
**Post date:** [November 11, 2006, 2:36am UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583/3 "2006-11-11T02:36:11Z")

</div>

On 11/nov/06, at 02:25, Gabriele M. wrote:

> 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 🙂

---

<div class="post-metadata">

**Author:** ![gregarican](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/7feea3/32.png) [@gregarican](https://www.ruby-forum.com/u/gregarican)\
**Post date:** [November 11, 2006, 2:46am UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583/4 "2006-11-11T02:46:12Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![gregarican](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/7feea3/32.png) [@gregarican](https://www.ruby-forum.com/u/gregarican)\
**Post date:** [November 12, 2006, 9:45pm UTC](https://www.ruby-forum.com/t/easy-way-to-do-a-https-post/75583/5 "2006-11-12T21:45:13Z")

</div>

On Sat, Nov 11, 2006 at 10:25:38AM +0900, Gabriele M. wrote:

> > 
> 
> ‘to’=\>‘2005-03-31’})  
> when Net::HTTPSuccess, Net::HTTPRedirection  
> req = Net::HTTP::Post.new(url.path)  
> 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/](http://mechanize.rubyforge.org/)
