2014-10-22 2 views
6

Используя RestClient камень, мне нужно создать запрос, такие как:Как я могу заставить RestClient Ruby использовать многозначный параметр запроса?

GET http://host/path?p=1&p=2 

Что такое правильный синтаксис для достижения этой цели? Обратите внимание, что принимающий узел не является Rails.

Пробовал:

resource = RestClient::Resource.new('http://host/path') 
params = { p: '1', p: '2' } 
#^Overrides param to have value of 2 (?p=2) 

params = { p: ['1','2'] } 
#^results in 'p[]=abc&p[]=cde' (array [] indicators not wanted) 

resource.get({ params: params }) 

ответ

4

Вы можете передать параметры в виде строки:

resource.get(params: 'p=1&p=2') 

Например, с помощью restclient оболочки:

>> RestClient.log = Logger.new(STDOUT) 
#<Logger:0x007fa444cbecc0 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007fa444cbec70 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x007fa444cbebd0 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDOUT>>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0x007fa444cbeba8 @mon_owner=nil, @mon_count=0, @mon_mutex=#<Mutex:0x007fa444cbeb58>>>> 
>> resource = RestClient::Resource.new('http://www.example.net') 
#<RestClient::Resource:0x007fa444c9fdc0 @url="http://www.example.net", @block=nil, @options={}> 
>> resource.get(params: 'p=1&p=2') 
RestClient.get "http://www.example.net", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Params"=>"p=1&p=2" 
# => 200 OK | text/html 1270 bytes 
"<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style type=\"text/css\">\n body {\n  background-color: #f0f0f2;\n  margin: 0;\n  padding: 0;\n  font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  \n }\n div {\n  width: 600px;\n  margin: 5em auto;\n  padding: 50px;\n  background-color: #fff;\n  border-radius: 1em;\n }\n a:link, a:visited {\n  color: #38488f;\n  text-decoration: none;\n }\n @media (max-width: 700px) {\n  body {\n   background-color: #fff;\n  }\n  div {\n   width: auto;\n   margin: 0 auto;\n   border-radius: 0;\n   padding: 1em;\n  }\n }\n </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n <p>This domain is established to be used for illustrative examples in documents. You may use this\n domain in examples without prior coordination or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n" 

Если вы не хотите писать код для построения strin g, чего вы должны избегать, потому что это не обязательно просто, пусть класс Ruby's URI скрежет его вместе:

require 'uri' 
URI::encode_www_form([['p', 1], ['p', 2]]) 
# => "p=1&p=2" 
1

Обнаружен этот вопрос для RestClient: https://github.com/rest-client/rest-client/issues/59 так что кажется, что это не может быть сделано 'родной' через Params.

Мое решение было изменить URL, используя:

query_params = "?p=1&p=2" 
resource[query_params].get 
Смежные вопросы