71

Is there a cURL library for Ruby?

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
user85748
  • 1,213
  • 3
  • 14
  • 21

13 Answers13

92

Curb and Curl::Multi provide cURL bindings for Ruby.

Mr. Ronald
  • 687
  • 4
  • 13
user1686
  • 13,155
  • 2
  • 35
  • 54
36

If you like it less low-level, there is also Typhoeus, which is built on top of Curl::Multi.

ryenus
  • 15,711
  • 5
  • 56
  • 63
Skade
  • 1,406
  • 1
  • 11
  • 14
31

Use OpenURI and

  open("http://...", :http_basic_authentication=>[user, password])

accessing sites/pages/resources that require HTTP authentication.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
apostlion
  • 720
  • 5
  • 10
  • 13
    Honestly, 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
  • 8
    Use 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
  • 7
    Well maybe because open-uri is part of standard library? – konung Mar 24 '11 at 21:13
  • 3
    Net::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
9

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.

Peter Cooper
  • 2,907
  • 28
  • 67
  • 87
8

HTTP clients is a good page to help you make decisions about the various clients.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Mr. Ronald
  • 687
  • 4
  • 13
7

You might also have a look at Rest-Client

Fadi
  • 1,329
  • 7
  • 22
  • 40
Anh
  • 6,523
  • 7
  • 46
  • 59
6

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
Aleksei Matiushkin
  • 119,336
  • 10
  • 100
  • 160
Seamus Abshere
  • 8,326
  • 4
  • 44
  • 61
6

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.

cbliard
  • 7,051
  • 5
  • 41
  • 47
5

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.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Douglas G. Allen
  • 2,203
  • 21
  • 20
5

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

method
  • 782
  • 4
  • 10
4

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.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
2

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
steel
  • 11,883
  • 7
  • 72
  • 109
0

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"
stevec
  • 41,291
  • 27
  • 223
  • 311