2012-10-30 18 views
17

C'è una libreria in Python che adoro chiamare "Richieste". Requests è un build client HTTP su urllib3. "requests doc".Ruby Equivalent della libreria Richieste Python (Client HTTP)

Sto cercando qualcosa di simile in Ruby. Fondamentalmente quello che mi serve è:

  • Supporto file di upload (multipart/form-data).
  • Easy get/post.
  • I cookie possono essere passati da un oggetto risposta a un oggetto richiesta (creare manualmente lo script di accesso).
  • Stabile e flessibile.
  • Supporto sessioni (per non dover gestire manualmente i cookie se non ne abbiamo troppo).

Ho visto Typhoeus, ma l'esempio di codice nella home page non funziona; hanno spostato il codice e il metodo get non è più direttamente accessibile in questo modo, quindi non sta iniziando bene. Curb sembra carino e mi piace cURL, c'è anche rest-client, che sembra popolare, e l'em-http sembra abbastanza veloce secondo il benchmark. C'è anche un Patron e un cordolo, che non ho avuto il tempo di provare. E, naturalmente, Net: HTTP. Ma non sembra avere una soluzione tradizionale a cui tutti puntino.

Penso che molte persone siano state nella mia situazione e mi chiedo che cosa hanno scelto e perché?

risposta

4

ho finalmente trovato utile questa HTTPClient: https://github.com/nahi/httpclient

ho iniziato a usarlo, abbina le caratteristiche che volevo, e più oltre è abbastanza veloce secondo alcuni benchmark. Supporta anche alcune cose avanzate come la risposta in streaming o Chunked. È un peccato che non sia famoso nella comunità di rubini. :)

2

Se hai bisogno di cookies e gestione dei moduli, mechanize è l'unico modo per andare.

+0

Penso che mechanize simuli un intero browser, no? – Hartator

+0

Ho bisogno di qualcosa di più barebone per fare la richiesta http direttamente ... – Hartator

+0

Uso molto httpclient. È una grande libreria per quando vuoi qualcosa di leggero. Ma non fa tutto nella tua lista e meccanizza. – pguardiario

6

Il OpenURI integrato è il primo posto da cercare. È semplice e gestisce bene le basi.

Il Typhoeus, che ho usato più volte per processi paralleli, funziona bene. Documentation e the codebase sono disponibili su Github.

irb(main):009:0> response = Typhoeus::Request.get("www.example.com") 
=> #<Typhoeus::Response:0x007ffbcc067cf8 @code=302, @curl_return_code=0, @curl_error_message="No error", @status_message=nil, @http_version=nil, @headers="HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/\r\nServer: BigIP\r\nConnection: close\r\nContent-Length: 0\r\n\r\n", @body="", @time=0.035584, @requested_url=nil, @requested_http_method=nil, @start_time=nil, @start_transfer_time=0.035529, @app_connect_time=2.8e-05, @pretransfer_time=0.000429, @connect_time=2.8e-05, @name_lookup_time=2.8e-05, @request=:method => :get, 
    :url => www.example.com, @effective_url="HTTP://www.example.com", @primary_ip="192.0.43.10", @redirect_count=0, @mock=false> 
irb(main):010:0> puts response.headers 
HTTP/1.0 302 Found 
Location: http://www.iana.org/domains/example/ 
Server: BigIP 
Connection: close 
Content-Length: 0 

Io uso Net :: HTTP a volte troppo, ma OpenURI e Tifeo, con Hydra, hanno dimostrato di essere facile da usare e integrare con il mio codice.

2

Mi dispiace sentire che Typhoeus non ha funzionato per te. La ragione è che il README mostra lavoro howto con Typhoeus v0.5.0.rc che può essere installato con

gem install typhoeus --pre 

o

gem "typhoeus", git: "git://github.com/typhoeus/typhoeus.git" 

. Non c'è supporto di sessione per Typhoeus ma a parte quello potrebbe essere una buona idea. Almeno è stabile da morire visto che è costruito su libcurl.

File invio esempio:

Typhoeus.post("www.example.com/file", body: { file: File.open("testfile.txt","r") }) 

c'è purtroppo nessuna scorciatoia per trattare con i cookie, è necessario impostare manualmente:

Typhoeus.get("www.example.com/needs_cookie", headers: { Cookie: "PRIVATE" }) 

TLDR: io sceglierei Tifeo per la sua velocità e libcurl se sei disposto a sistemarti da solo. Altrimenti guarderei su Faraday e lo uso con l'adattatore Typhoeus.

Modifica: ho aggiunto le istruzioni di installazione allo README.

Modifica: 0.5 viene rilasciato.

10

Ecco una matrice di funzionalità con una selezione di client HTTP per Ruby.

https://bit.ly/RubyHTTPClients

L'autore del confronto è l'autore di httpclient, ma dagli sguardi di esso il confronto è giusto.

Per uno stile più narrativo con alcune spiegazioni della matrice, vedere http://www.slideshare.net/HiroshiNakamura/rubyhttp-clients-comparison dello stesso autore.

Il confronto risulta in parte a favore di httpclient, che posso anche raccomandare. Semplice, funzionale, compatibile con tutte le piattaforme e performanti di Ruby. Migliore supporto dei cookie rispetto a qualsiasi altra cosa là fuori, ma la presentazione menziona che i cookie possono trapelare da un sito (malevolo) a un altro se si utilizza lo stesso oggetto client. Non so se questo è ancora vero.

+0

Sì, è ancora il caso per la roba dei cookie. Fortunatamente, è un grosso buco di sicurezza, è solo che puoi configurare i cookie per il dominio. .com. – Hartator

+0

Finché ne sei a conoscenza, probabilmente non è un grosso problema. I * think * (non fidatevi di me! Verify!) Che se istanziate due oggetti diversi per due siti, dovreste stare bene. – clacke

+1

sfortunatamente httpclient non viene mantenuto attivamente. Ho trovato [Excon] (https://github.com/geemus/excon) buono – w00d

Problemi correlati