Is there a cURL library for Ruby?
13 Answers
Use OpenURI and
open("http://...", :http_basic_authentication=>[user, password])
accessing sites/pages/resources that require HTTP authentication.

- 158,662
- 42
- 215
- 303

- 720
- 5
- 10
-
13Honestly, if I see that a library uses open-uri internally, I don't use that library. It's a deeply flawed library built on top of a deeply flawed URI parser. It's fine for usage in IRB and that's it. – Bob Aman Jun 01 '09 at 19:30
-
@Sporkmonger: Well, that's what we have— what do you suggest, raw Net::HTTP? – apostlion Jun 02 '09 at 05:18
-
8Use Net::HTTP or Patron or Curb or any of the other libraries mentioned in the other answers. How this answer got voted up or accepted is beyond me. – Bob Aman Oct 25 '09 at 03:22
-
7Well maybe because open-uri is part of standard library? – konung Mar 24 '11 at 21:13
-
3Net::HTTP and open-uri are both notoriously bad in how they do http. – Jordon Bedwell Jan 20 '13 at 21:30
-
What if you need to save a session in cookie you receive in respond to login request and you need to pass this cookie every time you fetch data ? – Krishna Prasad Varma Jun 14 '13 at 02:57
Curb-fu is a wrapper around Curb which in turn uses libcurl. What does Curb-fu offer over Curb? Just a lot of syntactic sugar - but that can be often what you need.

- 2,907
- 28
- 67
- 87
HTTP clients is a good page to help you make decisions about the various clients.

- 158,662
- 42
- 215
- 303

- 687
- 4
- 13
the eat
gem is a "replacement" for OpenURI, so you need to install the gem eat
in the first place
$ gem install eat
Now you can use it
require 'eat'
eat('http://yahoo.com') #=> String
eat('/home/seamus/foo.txt') #=> String
eat('file:///home/seamus/foo.txt') #=> String
It uses HTTPClient under the hood. It also has some options:
eat('http://yahoo.com', :timeout => 10) # timeout after 10 seconds
eat('http://yahoo.com', :limit => 1024) # only read the first 1024 chars
eat('https://yahoo.com', :openssl_verify_mode => 'none') # don't bother verifying SSL certificate

- 119,336
- 10
- 100
- 160

- 8,326
- 4
- 44
- 61
-
1I can't get this to work. `require': cannot load such file -- eat (LoadError) – Mark Locklear Jul 16 '14 at 15:02
If you know how to write your request as a curl
command, there is an online tool that can turn it into ruby (2.0+) code: curl-to-ruby
Currently, it knows the following options: -d/--data
, -H/--header
, -I/--head
, -u/--user
, --url
, and -X/--request
. It is open to contributions.

- 7,051
- 5
- 41
- 47
Here's a little program I wrote to get some files with.
base = "http://media.pragprog.com/titles/ruby3/code/samples/tutthreads_"
for i in 1..50
url = "#{ base }#{ i }.rb"
file = "tutthreads_#{i}.rb"
File.open(file, 'w') do |f|
system "curl -o #{f.path} #{url}"
end
end
I know it could be a little more eloquent but it serves it purpose. Check it out. I just cobbled it together today because I got tired of going to each URL to get the code for the book that was not included in the source download.

- 158,662
- 42
- 215
- 303

- 2,203
- 21
- 20
There's also Mechanize, which is a very high-level web scraping client that uses Nokogiri for HTML parsing.

- 130
- 11

- 782
- 4
- 10
Adding a more recent answer, HTTPClient is another Ruby library that uses libcurl, supports parallel threads and lots of the curl goodies. I use HTTPClient and Typhoeus for any non-trivial apps.

- 158,662
- 42
- 215
- 303
To state the maybe-too-obvious, tick marks execute shell code in Ruby as well. Provided your Ruby code is running in a shell that has curl
:
puts `curl http://www.google.com?q=hello`
or
result = `
curl -X POST https://www.myurl.com/users \
-d "name=pat" \
-d "age=21"
`
puts result

- 11,883
- 7
- 72
- 109
A nice minimal reproducible example to copy/paste into your rails console:
require 'open-uri'
require 'nokogiri'
url = "https://www.example.com"
html_file = URI.open(url)
doc = Nokogiri::HTML(html_file)
doc.css("h1").text
# => "Example Domain"

- 41,291
- 27
- 223
- 311