NOTE: This is the 4.x development branch. For the 3.x stable branch, please see:
https://github.com/httprb/http/tree/3-x-stable
HTTP (The Gem! a.k.a. http.rb) is an easy-to-use client library for making requests from Ruby. It uses a simple method chaining system for building requests, similar to Python's Requests.
Under the hood, http.rb uses http_parser.rb, a fast HTTP parsing native extension based on the Node.js parser and a Java port thereof. This library isn't just yet another wrapper around Net::HTTP. It implements the HTTP protocol natively and outsources the parsing to native extensions.
There are a lot of HTTP libraries to choose from in the Ruby ecosystem. So why would you choose this one?
Top three reasons:
-
Clean API: http.rb offers an easy-to-use API that should be a breath of fresh air after using something like Net::HTTP.
-
Maturity: http.rb is one of the most mature Ruby HTTP clients, supporting features like persistent connections and fine-grained timeouts.
-
Performance: using native parsers and a clean, lightweight implementation, http.rb achieves the best performance of any Ruby HTTP library which implements the HTTP protocol in Ruby instead of C:
HTTP client | Time | Implementation |
---|---|---|
curb (persistent) | 2.519 | libcurl wrapper |
em-http-request | 2.731 | EM + http_parser.rb |
Typhoeus | 2.851 | libcurl wrapper |
StreamlyFFI (persistent) | 2.853 | libcurl wrapper |
http.rb (persistent) | 2.970 | Ruby + http_parser.rb |
http.rb | 3.588 | Ruby + http_parser.rb |
HTTParty | 3.931 | Net::HTTP wrapper |
Net::HTTP | 3.959 | Pure Ruby |
Net::HTTP (persistent) | 4.043 | Pure Ruby |
open-uri | 4.479 | Net::HTTP wrapper |
Excon (persistent) | 4.618 | Pure Ruby |
Excon | 4.701 | Pure Ruby |
RestClient | 26.838 | Net::HTTP wrapper |
Benchmarks performed using excon's benchmarking tool
DISCLAIMER: Most benchmarks you find in READMEs are crap, including this one. These are out-of-date. If you care about performance, benchmark for yourself for your own use cases!
If you need help or just want to talk about the http.rb, visit the http.rb Google Group:
https://groups.google.com/forum/#!forum/httprb
You can join by email by sending a message to:
If you believe you've found a bug, please report it at:
https://github.com/httprb/http/issues
Add this line to your application's Gemfile:
gem "http"
And then execute:
$ bundle
Or install it yourself as:
$ gem install http
Inside of your Ruby program do:
require "http"
...to pull it in as a dependency.
Please see the http.rb wiki for more detailed documentation and usage notes.
The following API documentation is also available:
Here's some simple examples to get you started:
>> HTTP.get("https://github.com").to_s
=> "\n\n\n<!DOCTYPE html>\n<html lang=\"en\" class=\"\">\n <head prefix=\"o..."
That's all it takes! To obtain an HTTP::Response
object instead of the response
body, all we have to do is omit the #to_s
on the end:
>> HTTP.get("https://github.com")
=> #<HTTP::Response/1.1 200 OK {"Server"=>"GitHub.com", "Date"=>"Tue, 10 May...>
We can also obtain an HTTP::Response::Body
object for this response:
>> HTTP.get("https://github.com").body
=> #<HTTP::Response::Body:3ff756862b48 @streaming=false>
The response body can be streamed with HTTP::Response::Body#readpartial
.
In practice, you'll want to bind the HTTP::Response::Body to a local variable
and call #readpartial
on it repeatedly until it returns nil
: