SlideShare une entreprise Scribd logo
1  sur  77
Télécharger pour lire hors ligne
Ruby HTTP clients comparison
            Hiroshi Nakamura
          nahi at Twitter, github

    Technical Architect at Appirio Japan
       CRuby and JRuby committer
   Asakusa.rb: http://qwik.jp/asakusarb/
Ruby HTTP Clients Matrix
advantages-and-disadvantages comparison of
HTTP client libraries




      http://bit.ly/RubyHTTPClients2012
            Disclaimer: I'm the author of "httpclient"
Agenda
net/http
16 libraries I picked
Ruby HTTP Clients Matrix
  API style
  Compatibility
  Supported features
Performance Comparisons
My Recommendations
net/http




           Net::HTTP::Proxy?
           net/https?
Ruby HTTP Client libraries
HTTP client libraries I didn’t evaluate
Cannot evaluate
• activeresource (Rails specific)
• http (under development)
• http_request.rb (test doesn't pass)
• nestful (no test)
• typhoeus (under heavy rewrite)

Obsolete
• eventmachine (built-in client is obsolete)
• right_http_connection (no update)
• simplehttp (no update)
• rfuzz (no update)
Evaluation Axis
Project Stats
API style
Compatibility: CRuby, JRuby, Rubinius
Supported features
   Connection features
   Basic HTTP features
   Development support
   Advanced features
   http://bit.ly/RubyHTTPClientsFeatureTest (test/unit scripts)
Project Stats
Project Stats
API style
sync API (1/5) - Client instance
net/http, mechanize, httpclient, patron, curb, faraday
        client = Net::HTTP.new(host, port)
        p client.get(path).body

        client = Mechanize.new
        client = HTTPClient.new
        client = Patron::Session.new
        p client.get(url).body

        curl = Curl::Easy.new(url)
        curl.http_get
        p curl.body_str

        client = Faraday.new(:url => baseurl)
        p client.get(path).body
sync API (2/5) - Client class
      restfulie, excon, httpi

    p Restfulie.at(url).get!.body
    p Excon.get(url).body
    p HTTPI.get(url).body
sync API (3/5) - Resource
                   rest-client, rufus-verbs

rs = RestClient::Resource.new('http://example.com')
rs['posts/1/comments'].post 'Good article.', :content_type => 'text/plain'

ep = EndPoint.new(
 :host => "resta.farian.host", :port => 80, :resource => "inventory/tools")
res = ep.get :id => 1
res = ep.get :id => 2
sync API (4/5) - Include & Customize
                   httparty, weary

   client = Class.new { include HTTParty }
   p client.get(url)

   class WearyClient < Weary::Client
     domain 'http://api.target.org/'
     get :retrieve, '{path}'
   end
   p WearyClient.new.fetch(:path => path).perform.body
sync API (5/5) - Others
           open-uri.rb, wrest
# open-uri.rb
p open(url) { |f| f.read }

# wrest
p 'http://www.google.co.jp/'.to_uri.get.body
async API(1/2) - Callback
        em-http-request
 body = nil
 EM.run do
   req = EM::HttpRequest.new(
     'http://www.google.com/').get
   req.callback do
     body = req.response
     EM.stop
   end
   req.errback do
     body = nil
   end
 end
 p body
async API(2/2) - Polling
   httpclient, weary, wrest

  client = HTTPClient.new
  conn = client.get_async(url)
  conn.finished? # => false

  # ...
  io = conn.pop.content
  while str = io.read(4096)
    p str
  end
parallel API - curb
responses = []
m = Curl::Multi.new
urls.each do |url|
  responses[url] = ''
  m.add(Curl::Easy.new(url) { |curl|
    curl.on_body { |data|
      responses[url] << data
      data.bytesize
    }
  })
end
m.perform
p responses.map { |e| e.bytesize }
API style
Compatibility
Compatibility
Connection features
3 types of HTTP connections
Keep-Alive in em-http-request
 body = []
 EM.run do
   conn = EventMachine::HttpRequest.new(server.url)
   req1 = conn.get(:keepalive => true)
   req1.callback {
     body << req1.response
     req2 = conn.get(:keepalive => true)
     req2.callback {
       body << req2.response
       req3 = conn.get(:keepalive => true)
       req3.callback {
         body << req3.response
         req4 = conn.get(:keepalive => true)
         req4.callback {
           body << req4.response
           EM.stop
         req4.errback { ... }}
       req3.errback { ... }}
     req2.errback { ... }}
   req1.errback { ... }
 end
Pipelining in em-http-request
 body =   []
 EM.run   do
   conn   = EventMachine::HttpRequest.new(server.url)
   req1   = conn.get(:keepalive => true)
   req2   = conn.get(:keepalive => true)
   req3   = conn.get(:keepalive => true)
   req4   = conn.get()

  req1.callback   {    body     <<   req1.response }
  req2.callback   {    body     <<   req2.response }
  req3.callback   {    body     <<   req3.response }
  req4.callback   {    body     <<   req4.response; EM.stop }

   req1.errback   {   ...   }
   req2.errback   {   ...   }
   req3.errback   {   ...   }
   req4.errback   {   ...   }
 end
NO verification by default?!

if http.use_ssl?
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  if options[:ssl_ca_file]
    http.ca_file = options[:ssl_ca_file]
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  end
end




options[:ssl_ca_file] == nil => VERIFY_NONE
Connection features
Basic HTTP features
IRI: Internationalized Resource
                Identifier

client.get("http://www.ebooks.com/797059/some-kind-
of-peace/grebe-camilla-träff-åsa-norlen-paul/")



            uri.rb doesn't support IRI
              addressable/uri does
"Cross-site Cooking" bug in httpclient

Set-Cookie: TEST=test; path=/; domain=.com

          httpclient eats this cookie and
             send it to all *.com site

    Mechanize handles it properly like browsers

  http://en.wikipedia.org/wiki/Cross-site_cooking
Streaming upload/download
# Chunked upload with Patron
client = Patron::Session.new
res = client.request(:post, url, {}, :file => path_to_upload)
# Chunked download
client.get_file(url, path_to_write)

# Chunked upload with em-http-request
req = EM::HttpRequest.new(url).post :file => path_to_upload
# Chunked download
req = EM::HttpRequest.new(url).get
req.stream do |chunk|
  p chunk
end
Basic HTTP features
Development Support
Response stubbing
# Stubbing response body
client = HTTPClient.new
client.test_loopback_response << 'Hello!'
client.get('http://www.example.com/hello').body
#=> "Hello!"

# Stubbing HTTP response
client.test_loopback_http_response <<
  "HTTP/1.0 302 Found¥r¥nLocation: http://foo/¥r¥n¥r¥n" <<
  "HTTP/1.0 200 OK¥r¥n¥r¥nHello!"
client.post('http://www.example.com/todo',
  :follow_redirect => true, :body => '{}').body
#=> "Hello!"
IRB like shell
      rest-client, httpclient, wrest

% restclient https://example.com user pass
>> delete '/private/resource'

% httpclient
>> get "https://www.google.com", :q => :ruby

% wrest
>> 'http://www.google.com?q=ruby'.to_uri.get
Replayable log
                        rest-client

% RESTCLIENT_LOG=/tmp/restclient.log restclient
>> RestClient.get "https://www.google.com/"
...

% cat /tmp/restclient.log
RestClient.get "https://www.google.com/", "Accept"=>"*/*;
q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate"
# => 200 OK | text/html 13354 bytes
Development Support
Advanced features
HTML form handling of Mechanize

 agent = Mechanize.new
 page = agent.get(url)

 form = page.form('login')
 form.email = 'nahi@ruby-lang.org'
 form.password = 'jKH.P945wruV*qh3'

 page = agent.submit(form, form.button('submit'))
Advanced features
Testing your client
webmock by Bartosz Blimke (bblimke)
  Library for stubbing and setting expectations on
  HTTP requests in Ruby.
vcr by Myron Marston (myronmarston)
  Record your test suite's HTTP interactions and replay
  them during future test runs for fast, deterministic,
  accurate tests.
Performance Comparisons
Server
    Linode Xen VPS (Linode 512) at Fremont, CA
    Ubuntu 10.10
    Apache 2.2, KeepAlive On
Client
    AWS EC2 (m1.small) at North Virginia (us-east-1b)
    Ubuntu 12.04
    HTTP clients w/ CRuby 1.9.3p286

Multiple downloads of 177B.html and 24MB.zip

Don't take it serious!
   http://bit.ly/RubyHTTPClientsBenchmarkScript
Multiple 177B downloads




                          [sec]
[sec]
[sec]
My Recommendations
• Speed is the king => em-http-request, curb w/
  multi
• HTML operation, Cookies => Mechanize
• API client => Faraday and adapter based impls
• SSL, Connectivity => httpclient

Check the matrix before you use the libraries
Please let me know when you find incorrect cell
Development Timeline

Contenu connexe

Tendances

やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しAkira Nagata
 
JSX 速さの秘密 - 高速なJavaScriptを書く方法
JSX 速さの秘密 - 高速なJavaScriptを書く方法JSX 速さの秘密 - 高速なJavaScriptを書く方法
JSX 速さの秘密 - 高速なJavaScriptを書く方法Kazuho Oku
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~Recruit Lifestyle Co., Ltd.
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点Kuniyasu Suzaki
 
うちのRedmineの使い方
うちのRedmineの使い方うちのRedmineの使い方
うちのRedmineの使い方Tomohisa Kusukawa
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングAkihiko Matuura
 
大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れるShuhei Iitsuka
 
Redmine 5.0 + RedMica 2.1 新機能評価ガイド
Redmine 5.0 + RedMica 2.1 新機能評価ガイドRedmine 5.0 + RedMica 2.1 新機能評価ガイド
Redmine 5.0 + RedMica 2.1 新機能評価ガイドGo Maeda
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
Kernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixKernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixBrendan Gregg
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Debugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerDebugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerPriyank Kapadia
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM LoggingYuji Kubota
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門iKenji
 

Tendances (20)

やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
 
JSX 速さの秘密 - 高速なJavaScriptを書く方法
JSX 速さの秘密 - 高速なJavaScriptを書く方法JSX 速さの秘密 - 高速なJavaScriptを書く方法
JSX 速さの秘密 - 高速なJavaScriptを書く方法
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
 
Interpreter, Compiler, JIT from scratch
Interpreter, Compiler, JIT from scratchInterpreter, Compiler, JIT from scratch
Interpreter, Compiler, JIT from scratch
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
 
うちのRedmineの使い方
うちのRedmineの使い方うちのRedmineの使い方
うちのRedmineの使い方
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる
 
Redmine 5.0 + RedMica 2.1 新機能評価ガイド
Redmine 5.0 + RedMica 2.1 新機能評価ガイドRedmine 5.0 + RedMica 2.1 新機能評価ガイド
Redmine 5.0 + RedMica 2.1 新機能評価ガイド
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
Kernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixKernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at Netflix
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Debugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerDebugging Applications with GNU Debugger
Debugging Applications with GNU Debugger
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門エンジニアのプレゼン資料作成/入門
エンジニアのプレゼン資料作成/入門
 

En vedette

ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011Hiroh Satoh
 
Human toxicity, environmental impact and legal implications of water fluorida...
Human toxicity, environmental impact and legal implications of water fluorida...Human toxicity, environmental impact and legal implications of water fluorida...
Human toxicity, environmental impact and legal implications of water fluorida...Declan Waugh
 
These words I share, written from despair, read them, speak them, but do so w...
These words I share, written from despair, read them, speak them, but do so w...These words I share, written from despair, read them, speak them, but do so w...
These words I share, written from despair, read them, speak them, but do so w...Blair Stuart
 
正規言語について
正規言語について正規言語について
正規言語についてJumpei Ogawa
 
Isu isu trenda terkini dalam teknologi pendidikan
Isu isu trenda terkini dalam teknologi pendidikanIsu isu trenda terkini dalam teknologi pendidikan
Isu isu trenda terkini dalam teknologi pendidikanRenee Evelyn
 
Hazop gijutsushikai chubu koukuukai
Hazop gijutsushikai chubu koukuukai Hazop gijutsushikai chubu koukuukai
Hazop gijutsushikai chubu koukuukai Kiyoshi Ogawa
 
Yapc Asia 2009 ペパボでのPerlの使い方
Yapc Asia 2009 ペパボでのPerlの使い方Yapc Asia 2009 ペパボでのPerlの使い方
Yapc Asia 2009 ペパボでのPerlの使い方hiboma
 
The New Framework for Information Literacy for Higher Education
The New Framework for Information Literacy for Higher EducationThe New Framework for Information Literacy for Higher Education
The New Framework for Information Literacy for Higher EducationTrudi Jacobson
 
GBM Group Based Marketing: Marketing to Groups
GBM Group Based Marketing: Marketing to GroupsGBM Group Based Marketing: Marketing to Groups
GBM Group Based Marketing: Marketing to GroupsScott Levine
 
好みや多数決で決めない、デザインとの正しい付き合い方
好みや多数決で決めない、デザインとの正しい付き合い方好みや多数決で決めない、デザインとの正しい付き合い方
好みや多数決で決めない、デザインとの正しい付き合い方Yasuhisa Hasegawa
 
Corso storytelling a Gemona
Corso storytelling a GemonaCorso storytelling a Gemona
Corso storytelling a GemonaGemona Turismo
 
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...Bundesliga Report - 10 years of academies - Talent pools of top-level German ...
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...Ítalo de Oliveira Mendonça
 
Escaneado 09 03-2017 10.02
Escaneado 09 03-2017 10.02Escaneado 09 03-2017 10.02
Escaneado 09 03-2017 10.02Juan Carreón
 
ブレンダーをDisってみる
ブレンダーをDisってみるブレンダーをDisってみる
ブレンダーをDisってみるTetsuo Mitsuda
 
4 questions to help you secure ePHI today
4 questions to help you secure ePHI today4 questions to help you secure ePHI today
4 questions to help you secure ePHI todaySarabeth Marcello
 

En vedette (20)

JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Ruby HTTP clients
Ruby HTTP clientsRuby HTTP clients
Ruby HTTP clients
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
Human toxicity, environmental impact and legal implications of water fluorida...
Human toxicity, environmental impact and legal implications of water fluorida...Human toxicity, environmental impact and legal implications of water fluorida...
Human toxicity, environmental impact and legal implications of water fluorida...
 
These words I share, written from despair, read them, speak them, but do so w...
These words I share, written from despair, read them, speak them, but do so w...These words I share, written from despair, read them, speak them, but do so w...
These words I share, written from despair, read them, speak them, but do so w...
 
正規言語について
正規言語について正規言語について
正規言語について
 
Isu isu trenda terkini dalam teknologi pendidikan
Isu isu trenda terkini dalam teknologi pendidikanIsu isu trenda terkini dalam teknologi pendidikan
Isu isu trenda terkini dalam teknologi pendidikan
 
C# & AWS Lambda
C# & AWS LambdaC# & AWS Lambda
C# & AWS Lambda
 
Hazop gijutsushikai chubu koukuukai
Hazop gijutsushikai chubu koukuukai Hazop gijutsushikai chubu koukuukai
Hazop gijutsushikai chubu koukuukai
 
Yapc Asia 2009 ペパボでのPerlの使い方
Yapc Asia 2009 ペパボでのPerlの使い方Yapc Asia 2009 ペパボでのPerlの使い方
Yapc Asia 2009 ペパボでのPerlの使い方
 
The New Framework for Information Literacy for Higher Education
The New Framework for Information Literacy for Higher EducationThe New Framework for Information Literacy for Higher Education
The New Framework for Information Literacy for Higher Education
 
GBM Group Based Marketing: Marketing to Groups
GBM Group Based Marketing: Marketing to GroupsGBM Group Based Marketing: Marketing to Groups
GBM Group Based Marketing: Marketing to Groups
 
How to Kill a Word
How to Kill a WordHow to Kill a Word
How to Kill a Word
 
好みや多数決で決めない、デザインとの正しい付き合い方
好みや多数決で決めない、デザインとの正しい付き合い方好みや多数決で決めない、デザインとの正しい付き合い方
好みや多数決で決めない、デザインとの正しい付き合い方
 
Corso storytelling a Gemona
Corso storytelling a GemonaCorso storytelling a Gemona
Corso storytelling a Gemona
 
Ui qa tools
Ui qa toolsUi qa tools
Ui qa tools
 
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...Bundesliga Report - 10 years of academies - Talent pools of top-level German ...
Bundesliga Report - 10 years of academies - Talent pools of top-level German ...
 
Escaneado 09 03-2017 10.02
Escaneado 09 03-2017 10.02Escaneado 09 03-2017 10.02
Escaneado 09 03-2017 10.02
 
ブレンダーをDisってみる
ブレンダーをDisってみるブレンダーをDisってみる
ブレンダーをDisってみる
 
4 questions to help you secure ePHI today
4 questions to help you secure ePHI today4 questions to help you secure ePHI today
4 questions to help you secure ePHI today
 

Similaire à Ruby HTTP clients comparison

Rpi python web
Rpi python webRpi python web
Rpi python websewoo lee
 
Java web programming
Java web programmingJava web programming
Java web programmingChing Yi Chan
 
Rapid API development examples for Impress Application Server / Node.js (jsfw...
Rapid API development examples for Impress Application Server / Node.js (jsfw...Rapid API development examples for Impress Application Server / Node.js (jsfw...
Rapid API development examples for Impress Application Server / Node.js (jsfw...Timur Shemsedinov
 
Java servlet life cycle - methods ppt
Java servlet life cycle - methods pptJava servlet life cycle - methods ppt
Java servlet life cycle - methods pptkamal kotecha
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Masahiro Nagano
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCLFastly
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Webnickmbailey
 
Rapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesRapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesciklum_ods
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundOmer Gazit
 
API Days Australia - Automatic Testing of (RESTful) API Documentation
API Days Australia  - Automatic Testing of (RESTful) API DocumentationAPI Days Australia  - Automatic Testing of (RESTful) API Documentation
API Days Australia - Automatic Testing of (RESTful) API DocumentationRouven Weßling
 
Testing http calls with Webmock and VCR
Testing http calls with Webmock and VCRTesting http calls with Webmock and VCR
Testing http calls with Webmock and VCRKerry Buckley
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 

Similaire à Ruby HTTP clients comparison (20)

Intro to Node
Intro to NodeIntro to Node
Intro to Node
 
Intro to PSGI and Plack
Intro to PSGI and PlackIntro to PSGI and Plack
Intro to PSGI and Plack
 
Rpi python web
Rpi python webRpi python web
Rpi python web
 
Server Side Swift: Vapor
Server Side Swift: VaporServer Side Swift: Vapor
Server Side Swift: Vapor
 
Java web programming
Java web programmingJava web programming
Java web programming
 
Rapid API development examples for Impress Application Server / Node.js (jsfw...
Rapid API development examples for Impress Application Server / Node.js (jsfw...Rapid API development examples for Impress Application Server / Node.js (jsfw...
Rapid API development examples for Impress Application Server / Node.js (jsfw...
 
Web Server.pdf
Web Server.pdfWeb Server.pdf
Web Server.pdf
 
Java servlet life cycle - methods ppt
Java servlet life cycle - methods pptJava servlet life cycle - methods ppt
Java servlet life cycle - methods ppt
 
Rest with Spring
Rest with SpringRest with Spring
Rest with Spring
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
Palestra VCR
Palestra VCRPalestra VCR
Palestra VCR
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Web
 
Rapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesRapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devices
 
Basics Of Servlet
Basics Of ServletBasics Of Servlet
Basics Of Servlet
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
 
API Days Australia - Automatic Testing of (RESTful) API Documentation
API Days Australia  - Automatic Testing of (RESTful) API DocumentationAPI Days Australia  - Automatic Testing of (RESTful) API Documentation
API Days Australia - Automatic Testing of (RESTful) API Documentation
 
Rack
RackRack
Rack
 
Testing http calls with Webmock and VCR
Testing http calls with Webmock and VCRTesting http calls with Webmock and VCR
Testing http calls with Webmock and VCR
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 

Plus de Hiroshi Nakamura

エンタープライズソフトウェア開発とOSS
エンタープライズソフトウェア開発とOSSエンタープライズソフトウェア開発とOSS
エンタープライズソフトウェア開発とOSSHiroshi Nakamura
 
Information security programming in ruby
Information security programming in rubyInformation security programming in ruby
Information security programming in rubyHiroshi Nakamura
 
ちゃんと理解するForce.com canvas
ちゃんと理解するForce.com canvasちゃんと理解するForce.com canvas
ちゃんと理解するForce.com canvasHiroshi Nakamura
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyJavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyHiroshi Nakamura
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)Hiroshi Nakamura
 
HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方Hiroshi Nakamura
 

Plus de Hiroshi Nakamura (10)

エンタープライズソフトウェア開発とOSS
エンタープライズソフトウェア開発とOSSエンタープライズソフトウェア開発とOSS
エンタープライズソフトウェア開発とOSS
 
Information security programming in ruby
Information security programming in rubyInformation security programming in ruby
Information security programming in ruby
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
ちゃんと理解するForce.com canvas
ちゃんと理解するForce.com canvasちゃんと理解するForce.com canvas
ちゃんと理解するForce.com canvas
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyJavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)
 
現実世界のJRuby
現実世界のJRuby現実世界のJRuby
現実世界のJRuby
 
HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方
 
HSM超入門講座
HSM超入門講座HSM超入門講座
HSM超入門講座
 

Ruby HTTP clients comparison

  • 1. Ruby HTTP clients comparison Hiroshi Nakamura nahi at Twitter, github Technical Architect at Appirio Japan CRuby and JRuby committer Asakusa.rb: http://qwik.jp/asakusarb/
  • 2. Ruby HTTP Clients Matrix advantages-and-disadvantages comparison of HTTP client libraries http://bit.ly/RubyHTTPClients2012 Disclaimer: I'm the author of "httpclient"
  • 3. Agenda net/http 16 libraries I picked Ruby HTTP Clients Matrix API style Compatibility Supported features Performance Comparisons My Recommendations
  • 4. net/http Net::HTTP::Proxy? net/https?
  • 5. Ruby HTTP Client libraries
  • 6. HTTP client libraries I didn’t evaluate Cannot evaluate • activeresource (Rails specific) • http (under development) • http_request.rb (test doesn't pass) • nestful (no test) • typhoeus (under heavy rewrite) Obsolete • eventmachine (built-in client is obsolete) • right_http_connection (no update) • simplehttp (no update) • rfuzz (no update)
  • 7. Evaluation Axis Project Stats API style Compatibility: CRuby, JRuby, Rubinius Supported features Connection features Basic HTTP features Development support Advanced features http://bit.ly/RubyHTTPClientsFeatureTest (test/unit scripts)
  • 9.
  • 10.
  • 11.
  • 14.
  • 15. sync API (1/5) - Client instance net/http, mechanize, httpclient, patron, curb, faraday client = Net::HTTP.new(host, port) p client.get(path).body client = Mechanize.new client = HTTPClient.new client = Patron::Session.new p client.get(url).body curl = Curl::Easy.new(url) curl.http_get p curl.body_str client = Faraday.new(:url => baseurl) p client.get(path).body
  • 16. sync API (2/5) - Client class restfulie, excon, httpi p Restfulie.at(url).get!.body p Excon.get(url).body p HTTPI.get(url).body
  • 17. sync API (3/5) - Resource rest-client, rufus-verbs rs = RestClient::Resource.new('http://example.com') rs['posts/1/comments'].post 'Good article.', :content_type => 'text/plain' ep = EndPoint.new( :host => "resta.farian.host", :port => 80, :resource => "inventory/tools") res = ep.get :id => 1 res = ep.get :id => 2
  • 18. sync API (4/5) - Include & Customize httparty, weary client = Class.new { include HTTParty } p client.get(url) class WearyClient < Weary::Client domain 'http://api.target.org/' get :retrieve, '{path}' end p WearyClient.new.fetch(:path => path).perform.body
  • 19. sync API (5/5) - Others open-uri.rb, wrest # open-uri.rb p open(url) { |f| f.read } # wrest p 'http://www.google.co.jp/'.to_uri.get.body
  • 20. async API(1/2) - Callback em-http-request body = nil EM.run do req = EM::HttpRequest.new( 'http://www.google.com/').get req.callback do body = req.response EM.stop end req.errback do body = nil end end p body
  • 21. async API(2/2) - Polling httpclient, weary, wrest client = HTTPClient.new conn = client.get_async(url) conn.finished? # => false # ... io = conn.pop.content while str = io.read(4096) p str end
  • 22. parallel API - curb responses = [] m = Curl::Multi.new urls.each do |url| responses[url] = '' m.add(Curl::Easy.new(url) { |curl| curl.on_body { |data| responses[url] << data data.bytesize } }) end m.perform p responses.map { |e| e.bytesize }
  • 23.
  • 24.
  • 27.
  • 30.
  • 31. 3 types of HTTP connections
  • 32.
  • 33. Keep-Alive in em-http-request body = [] EM.run do conn = EventMachine::HttpRequest.new(server.url) req1 = conn.get(:keepalive => true) req1.callback { body << req1.response req2 = conn.get(:keepalive => true) req2.callback { body << req2.response req3 = conn.get(:keepalive => true) req3.callback { body << req3.response req4 = conn.get(:keepalive => true) req4.callback { body << req4.response EM.stop req4.errback { ... }} req3.errback { ... }} req2.errback { ... }} req1.errback { ... } end
  • 34. Pipelining in em-http-request body = [] EM.run do conn = EventMachine::HttpRequest.new(server.url) req1 = conn.get(:keepalive => true) req2 = conn.get(:keepalive => true) req3 = conn.get(:keepalive => true) req4 = conn.get() req1.callback { body << req1.response } req2.callback { body << req2.response } req3.callback { body << req3.response } req4.callback { body << req4.response; EM.stop } req1.errback { ... } req2.errback { ... } req3.errback { ... } req4.errback { ... } end
  • 35.
  • 36. NO verification by default?! if http.use_ssl? http.verify_mode = OpenSSL::SSL::VERIFY_NONE if options[:ssl_ca_file] http.ca_file = options[:ssl_ca_file] http.verify_mode = OpenSSL::SSL::VERIFY_PEER end end options[:ssl_ca_file] == nil => VERIFY_NONE
  • 37.
  • 38.
  • 39.
  • 42.
  • 43.
  • 44. IRI: Internationalized Resource Identifier client.get("http://www.ebooks.com/797059/some-kind- of-peace/grebe-camilla-träff-åsa-norlen-paul/") uri.rb doesn't support IRI addressable/uri does
  • 45.
  • 46. "Cross-site Cooking" bug in httpclient Set-Cookie: TEST=test; path=/; domain=.com httpclient eats this cookie and send it to all *.com site Mechanize handles it properly like browsers http://en.wikipedia.org/wiki/Cross-site_cooking
  • 47.
  • 48.
  • 49.
  • 50.
  • 51. Streaming upload/download # Chunked upload with Patron client = Patron::Session.new res = client.request(:post, url, {}, :file => path_to_upload) # Chunked download client.get_file(url, path_to_write) # Chunked upload with em-http-request req = EM::HttpRequest.new(url).post :file => path_to_upload # Chunked download req = EM::HttpRequest.new(url).get req.stream do |chunk| p chunk end
  • 52.
  • 53.
  • 56.
  • 57. Response stubbing # Stubbing response body client = HTTPClient.new client.test_loopback_response << 'Hello!' client.get('http://www.example.com/hello').body #=> "Hello!" # Stubbing HTTP response client.test_loopback_http_response << "HTTP/1.0 302 Found¥r¥nLocation: http://foo/¥r¥n¥r¥n" << "HTTP/1.0 200 OK¥r¥n¥r¥nHello!" client.post('http://www.example.com/todo', :follow_redirect => true, :body => '{}').body #=> "Hello!"
  • 58.
  • 59.
  • 60. IRB like shell rest-client, httpclient, wrest % restclient https://example.com user pass >> delete '/private/resource' % httpclient >> get "https://www.google.com", :q => :ruby % wrest >> 'http://www.google.com?q=ruby'.to_uri.get
  • 61. Replayable log rest-client % RESTCLIENT_LOG=/tmp/restclient.log restclient >> RestClient.get "https://www.google.com/" ... % cat /tmp/restclient.log RestClient.get "https://www.google.com/", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate" # => 200 OK | text/html 13354 bytes
  • 62.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69. HTML form handling of Mechanize agent = Mechanize.new page = agent.get(url) form = page.form('login') form.email = 'nahi@ruby-lang.org' form.password = 'jKH.P945wruV*qh3' page = agent.submit(form, form.button('submit'))
  • 71. Testing your client webmock by Bartosz Blimke (bblimke) Library for stubbing and setting expectations on HTTP requests in Ruby. vcr by Myron Marston (myronmarston) Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
  • 72. Performance Comparisons Server Linode Xen VPS (Linode 512) at Fremont, CA Ubuntu 10.10 Apache 2.2, KeepAlive On Client AWS EC2 (m1.small) at North Virginia (us-east-1b) Ubuntu 12.04 HTTP clients w/ CRuby 1.9.3p286 Multiple downloads of 177B.html and 24MB.zip Don't take it serious! http://bit.ly/RubyHTTPClientsBenchmarkScript
  • 74. [sec]
  • 75. [sec]
  • 76. My Recommendations • Speed is the king => em-http-request, curb w/ multi • HTML operation, Cookies => Mechanize • API client => Faraday and adapter based impls • SSL, Connectivity => httpclient Check the matrix before you use the libraries Please let me know when you find incorrect cell