.

Compatibility [0]versionImplementation1.9?JRuby?Rubinius? (1.2.3)1.8?API styleinterpreter blockingsyncparallelasyncconcurrency modelerror handlingAPI noteConnection featuresproxyproxy authkeep-alivepipeliningSSLtrust anchorSNIbasic authdigest authNTLM autherror retryBasic featuresgetpostput/deletecustom (ex. PURGE)response headerCookiefollow redirectredirect limitmultipartstreaming uploadstreaming downloadcompression (gzip)response encoding (1.9)Advanced featuresHTML form handlingJSON auto-convertXML auto-convertresource abstractionresponse cachingloggingwiredump debugresponse stubbingreq/res hookIRB like shellProject stats at 2011-04-08MaintainerWatchesForksDownloads (rubygems)repository location

.

net/http variantsnet/http1.9.2pure rubyYESYESYESVERIFY_NONE by default
multipart&gzip not supported
net/httpNOYESNONOsingle threadexceptionYou should set host, port and path by yourself for using effectively.net/httpYESYESYES (manual)NOYES (manual)configurablefrom 1.9.3YESNONO ->
ruby-ntlm
NOnet/httpYESYESYESNOYESNONON/AYES (manual)YES (manual)YESYES (only for HTTP#get)NOnet/httpNONONONONONOYESNO -> fakeweb, webmock gemNONOnet/httpMinero AokiN/AN/AN/Ahttp://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/net/http.rb

.

open-uri1.9.2net/httpYESYESYESSSL trust anchor is not configuableopen-uriNOYESNONOsingle threadexceptionopen(url) { |f| f.read }open-uriYESYESNONOYESopensslfrom 1.9.3YESNONONOopen-uriYESNONONOYESNOYES (default)YESNON/AYESNOYESopen-uriNONONONONONONONONONOopen-uriAkira TanakaN/AN/AN/Ahttp://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/open-uri.rb

.

httparty0.7.4net/httpYESYESYESYEShttpartyNOYESNONOsingle threadexceptionclass Foo; include HTTParty; end; Foo.get()
1 Class(!= Object) per Thread
httpartyYESNONONOVERIFY_NONE by defaultconfigurablefrom 1.9.3YESYESNONOhttpartyYESYESYESNOYESNOYES (default)YESNONONONONOhttpartyNOYESYESYESNONOYESNONONOhttpartyJohn Nunemaker1,051 137 322,875 https://github.com/jnunemaker/httparty

.

mechanize2.0.pre.2 (prerelease)net/httpYESYESYESYESmechanizeNOYESNONOsingle threadsingle threadagent = Mechanize.new; agent.get(url)mechanizeYESYESYESNOVERIFY_NONE by defaultconfigurablefrom 1.9.3YESYESNONOmechanizeYESYESYESNOYESYES ('.' start domain only?)YES (default)YESYESYESNOYES (default)NOmechanizeYESNONONOYESYESYESNOYESNOmechanize
(2011-04-18)
Eric Hodel618 77 176,946 https://github.com/tenderlove/mechanize

.

rest-client1.6.1net/httpYESYESYESYESrest-clientNOYESNONOsingle threadexceptionRestClient.get(url)rest-clientYESYESNONOVERIFY_NONE by defaultconfigurablefrom 1.9.3YESNONONOrest-clientYESYESYESNOYESYES (single cookie only?)YES (default)NO (stack overflow)YESYESNOYES (default)NOrest-clientNONONOYESNoYES (for replay)NONOYESYESrest-clientJulien Kirch502 127 574,152 https://github.com/archiloque/rest-client

.

right_http_
connection
1.3.0net/httpYESYESYESYESright_http_
connection
NOYESNONOsingle threadexceptionconn.request(:server => host, :port => port, request => Net::HTTP::Get.new(...))right_http_
connection
YESYESYESNOhostname not checkedN/AN/AYESNONO ->
ruby-ntlm
YESright_http_
connection
YESYESNONOYESNONON/ANOYESYESNONOright_http_
connection
NONONONONOYESNONONONOright_http_
connection
RightScale22 12 179,179 https://github.com/rightscale/right_http_connection

.

rufus-verbs1.0.0net/httpYESYESYESYESrufus-verbsNOYESNONOsingle threadexceptionclass Foo; include Rufus::Verbs; end; Then you can call Foo#get() from private scope.rufus-verbsYESYESNONOVERIFY_NONE by defaultopenssl (hard to configure)from 1.9.3YESYESNONOrufus-verbsYESYESYESNOYESYES (single cookie only?)YES (default)YES (no limit by deafult)NONONOYES (default for GET)NOrufus-verbsNONONOYESYESYESNONONONOrufus-verbsJohn Mettraux6 0 3,601 https://github.com/jmettraux/rufus-verbs

.

simplehttp0.1.3net/httpYESYESYESYESsimplehttpNOYESNONOsingle threadexceptionSimpleHttp.new(url).get()simplehttpYESNO (bug)NONOYESopenssl (hard to configure)from 1.9.3YESNONONOsimplehttpYESYESNONOYESNOYESYESNONONONONOsimplehttpNONONONONONONONONONOsimplehttpa28002762 2 1,675 https://github.com/a2800276/simplehttp

.

activeresource3.0.6net/httpYESYESYESYESactiveresourceNOYESNONOmulti-threadexception(CAUTION: these matrix YES/NO is from README)activeresourceYESYESNONOVERIFY_NONE by defaultconfigurablefrom 1.9.3YESYESNONOactiveresourceYESYESYESNOYESNONON/ANONONOYES (default for GET)NOactiveresourceNOYESYESYESNOYESNOYESNONOactiveresourcerails8,043 1,403 3,363,813 https://github.com/rails/rails

.

libcurl variantscurb0.7.15libcurl + extYESYES (1.6 + cext; experimental)? (SEGV for a test)YEScurbNOYESYESNOsingle threadexceptionc = Curl::Easy.new(url); c.http_get; c.body_strcurbYESYESNOYESNO verification (bug?)N/AN/AYESYESYESNOcurbYESYESYESNONO (String)YES (cannot extract)YESYES (no limit by deafult)YESYES (PUT only)YESYESNOcurbNONONONONONOYESNO -> webmock gemNONOcurbTodd Fisher268 33 155,208 https://github.com/taf2/curb/

.

patron0.4.11libcurl + extYESYES (1.6 + cext; experimental)YESYESpatronYESYESNONOsequentialexceptions = Patron::Session.new; s.base_url = url; s.get('foo')patronYESYESYESNOYESlibcurl (not configurable)YESYESYESYESNOpatronYESYESYESNOYESYES (cannot extract)YESYESYESYESYESNONOpatronNONONOYESNONOYESNO -> webmock gemNONOpatronPhillip Toland317 22 14,944 https://github.com/toland/patron

.

typhoeus0.2.4libcurl + extYESYES (1.6 + cext; experimental)? (blocks for a test)YEStyphoeus"Easy" blocks, "Request" is safeYESYESNOsingle thread (MT unsafe)error codeTyphoeus::Request.get(url)typhoeusYESYESYESNOYESlibcurlYESYESYESYESNOtyphoeusYESYESYESYESNO (String)YES (single cookie only?)YESYES (no limit by deafult)YESNONOYES (default)NOtyphoeusNONONONOYESNOYESYESYESNOtyphoeusDavid Balatero961 69 47,523 https://github.com/dbalatero/typhoeus

.

originaleventmachine0.12.10extYESYES
(threading issue)
YESYESeventmachineNONOYESYESreactorerror callback(hard to summarize; set callback procedures which won't block)eventmachineNON/ANONONO verificationN/AN/ANONONONOeventmachineYESNONONOYESNONON/AN/AN/AN/ANONOeventmachineNONONONONONONONONONOeventmachineeventmachine924 117 512,657 https://github.com/eventmachine/eventmachine

.

em-http-request1.0.0.beta.3 (prerelease)eventmachineYESNOYESYESem-http-requestNOYES (with em-synchrony)YESYESreactorerror callback(hard to summarize; set callback procedures which won't block)em-http-requestYESYESYES (doable but hard)YESNO verificationN/AN/AYESNONONOem-http-requestYESYESYESYESYESNOYESYESNO YESYESYESYESem-http-requestNOYESNONONONONONO -> webmock gemYES (Middleware)NOem-http-request (2011-04-18)Ilya Grigorik428 54 44,071 https://github.com/igrigorik/em-http-request

.

excon0.6.1pure rubyYESYESYESYESexconNOYESNONOmulti-threadexceptionExcon.get(url)exconYESNOYESNOVERIFY_NONE by defaultopensslfrom 1.9.3NONONONOexconYESYESYESYESYESNONON/ANONOYES (chunk size is 1MB)NONOexconNONONONONONONOYESNONOexconWesley Beary150 23 71,890 https://github.com/geemus/excon

.

httpclient2.2.0pure rubyYESYESYESYEShttpclientNOYESNOYESmulti-threadexceptionHTTPClient.get(url)httpclientYESYESYESNoYESselfYESYESYESYESNOhttpclientYESYESYESYESYESYESYESYESYESYESYESYES (without JRuby)NOhttpclientNONONONONONOYESYESYESNOhttpclientHiroshi Nakamura107 17 149,527 https://github.com/nahi/httpclient

.

wrapperfaraday0.6.0patron, typhoeus, excon or net/httpYESYESYESYESfaradayYES (with patron)YESYES (with typhoeus)NOsingle thread(depends on adapter)c = Faraday.new(base_url); c.get(url.path)faradayYES (with net/http)YESYES (not with net/http)NOYES (with net/http)configurable(depends on adapter)YESNONONOfaradayYESYESYESNOYESNONON/AYESNONO(depends on adapter)NOfaradayNOYES (only request)NONONOYESNOYESYESNOfaradayrick208 30 191,941 https://github.com/technoweenie/faraday

.

wrest1.4.2patron or net/httpYESYESYESYESwrestYES (with patron)YESNOYESmulti-threadexceptionurl.to_uri.get()wrestNON/ANONOYES (with net/http)configurable(depends on adapter)YESNONONOwrestYESYESYESNOYESNOYES (default)YESYES (with net/http)NONONONOwrestNOYESYESNOYESYESYESNOYESYESwrestSidu Ponnappa133 15 6,835 https://github.com/kaiwren/wrest

.

for 1.8rfuzz0.9extNO??YESrfuzzNOYESNONOmulti-threaderror code(CAUTION: these matrix YES/NO is from README)rfuzzNONONONONON/AN/ANONONONOrfuzzYESYESYESYESYESNOYESYESNONONONON/ArfuzzNONONONONONONONONONOrfuzzZed Shaw1,546 http://rubyforge.org/scm/?group_id=1944

.

[0] Author: nahi@ruby-lang.org (@nahi on Twitter). Test scripts are at https://github.com/asakusarb/odrk-http-client
[1] multipart_body gem would help you doing multipart form upload manually. For example, see an em-http-request sample at https://gist.github.com/778639