Pasa los parámetros GET con Ruby Curb

Estoy tratando de usar Curb (curb.rubyforge.org) para llamar a una API RESTful que necesita parámetros en una solicitud de obtención.

Quiero obtener una URL como http://foo.com/bar.xml?bla=blablabla . Me gustaría poder hacer algo como

 Curl::Easy.perform("http://foo.com/bar.xml", :bla => 'blablabla') {|curl| curl.set_some_headers_if_necessary } 

pero hasta ahora, la única forma en que puedo ver esto es incluir manualmente el ?bla=blablabla en la URL y hacer la encoding yo mismo. Seguramente hay una forma correcta de hacerlo, pero no puedo resolverlo leyendo la documentación.

Si no le importa usar ActiveSupport ‘~> 3.0’, hay una solución fácil: el método to_query , que convierte el hash en una cadena de consulta lista para usar en la URL.

 # active_support cherry-pick require 'active_support/core_ext/object/to_query' params = { :bla => 'blablabla' } Curl::Easy.perform("http://foo.com/bar.xml?" + params.to_query) {|curl| curl.set_some_headers_if_necessary } 

Para pasar los parámetros de obtención con la gem de bordillo de Ruby que podrías usar

 Curl::postalize(params) 

Estas funciones en realidad recurren a URI.encode_www_form (params) en la implementación de la gem de bordillo. https://github.com/taf2/curb/blob/f89bb4baca3fb3482dfc26bde8f0ade9f1a4b2c2/lib/curl.rb

Un ejemplo de cómo usar esto sería

 curl = Curl::Easy.new curl.url = "#{base_url}?#{Curl::postalize(params)}" curl.perform 

Para acceder a la cadena de retorno de enrollamiento que podría utilizar.

 data = curl.body_str 

Las segundas alternativas serían

 curl = Curl::Easy.new curl.url = Curl::urlalize(base_url, params) curl.perform data = curl.body_str 

Tenga en cuenta que Curl :: urlalize puede tener algunas fallas. Vea este impulso para postalize que solucionó este problema, pero urlalize todavía usa la implementación anterior.

¿Qué tal si simplemente se pasa una url de escape URI al método de ejecución (http_get)?

Consulte http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI/Escape.html

 Curl::Easy.perform(URI.escape("http://foo.com/bar.xml?bla=blablabla").to_s) {|curl| curl.set_some_headers_if_necessary } 

¿Has considerado una gem diferente? rest-client funciona bastante bien y te permite hacer:

 RestClient.get 'http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}} 

(Me doy cuenta de que ha preguntado por Curb. No tengo ninguna experiencia con Curb, lo siento. Rest-client ha sido bastante confiable cada vez que lo he usado).