Передать параметры GET с помощью Ruby Curb - PullRequest
4 голосов
/ 10 ноября 2011

Я пытаюсь использовать Curb (curb.rubyforge.org) для вызова RESTful API, для которого нужны параметры, указанные в запросе get.

Я хочу получить URL-адрес типа http://foo.com/bar.xml?bla=blablabla. Я хотел бы иметь возможность сделать что-то вроде

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

но до сих пор единственный способ сделать это - вручную включить ?bla=blablabla в URL и выполнить кодирование самостоятельно. Конечно, есть правильный способ сделать это, но я не могу понять это, читая документацию.

Ответы [ 4 ]

7 голосов
/ 15 августа 2013

Чтобы передать параметры get с гемом ruby ​​curb, вы можете использовать

Curl::postalize(params)

Эта функция фактически использует URI.encode_www_form (params) в реализации гема curb.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

Вторая альтернатива будетbe

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

Обратите внимание, что Curl :: urlalize может быть слегка испорчен, посмотрите это pull для postalize, который исправил этот недостаток, но urlalize все еще использует старую реализацию.

3 голосов
/ 10 ноября 2011

Если вы не возражаете против использования 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
}
1 голос
/ 10 ноября 2011

Вы рассматривали другой драгоценный камень? rest-client работает довольно хорошо и позволяет вам:

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

(я понимаю, вы спрашивали о Curb. У меня нет опыта работы с Curb, извините. Rest-clientбыл довольно надежным каждый раз, когда я его использовал).

1 голос
/ 10 ноября 2011

Как насчет простой передачи URL-адреса escape-URI методу execute (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
}
...