使用Ruby Curb传递GET参数

我正在尝试使用Curb(curb.rubyforge.org)来调用需要在get请求中提供的参数的RESTful API。

我想获取像http://foo.com/bar.xml?bla=blablabla这样的url。 我希望能够做类似的事情

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

但到目前为止,我能看到的唯一方法是在URL中手动包含?bla=blablabla并自己进行编码。 当然有一种正确的方法可以做到这一点,但我无法弄清楚阅读文档。

如果你不介意使用ActiveSupport’〜> 3.0’,那么有一个简单的解决方法 – to_query方法,它将哈希值转换为准备在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 } 

要使用你可以使用的ruby curb gem传递get参数

 Curl::postalize(params) 

这个函数实际上回退到curb gem实现中的URI.encode_www_form(params)。 https://github.com/taf2/curb/blob/f89bb4baca3fb3482dfc26bde8f0ade9f1a4b2c2/lib/curl.rb

关于如何使用它的一个例子是

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

要访问您可以使用的curl返回字符串。

 data = curl.body_str 

第二种选择是

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

请注意,Curl :: urlalize可能会有轻微的缺陷,请参阅postalize这个修复此漏洞的内容,但urlalize仍然使用旧的实现。

如何简单地将URI转义url传递给perform(http_get)方法?

见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 } 

你考虑过不同的gem吗? rest-client工作得很好,让你做:

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

(我意识到你问过Curb。我对Curb没有任何经验,抱歉。每次我使用它时,rest-client都非常可靠)。