2012-01-09 2 views
1

Я использую API, который требует, чтобы я отправил запрос на URL-адрес с одним из полей, переданных как массив. Например:Как использовать квадратные скобки [] в URI в Ruby HTTP-запрос

"http://www.example.com/objects/add.php?key=XXXXXXXXXXX;objects=[%7B%2522field1%2522%253A%2522My%2520ObjectA2%2522%7D%252C%7B%2522field%2522%253A%2522ObjectB%2522%252C%2522color%2522%253A%25221%2522%252C%2522note%2522%253A%252298765%2522%7D];ids=foo,bar" 

Как вы можете видеть, содержимое массива должен быть URL-закодированы, но весь URL нет. Да, я знаю, что это странно, но так настроен API. Когда я вхожу в URI в Chrome и нажимаю enter, он работает, но когда я использую Typhoeus (или net/http) для кодирования URI перед его передачей, он терпит неудачу (запрос проходит, но API не распознает его должным образом) ,

Как заставить Ruby выдать HTTP-запрос на этот URI без Кодирование в квадратных скобках?

EDIT: Этот ответ SO выглядел многообещающим, но я не совсем уверен, как изменить альпинизм в соответствии с этим примером.

How do I monkey-patch ruby's URI.parse method

+0

Да, это поможет фактический код. Кроме того, проверьте журналы своего веб-сервера, чтобы точно узнать, что ваш запрос был переведен в оба экземпляра (Chrome против Ruby). – theglauber

+1

@Krule: Что делает его недействительным? –

ответ

1

Typhoeus позволяет передавать параметры HTTP с помощью рубин конструирует. Для получения URL, похожий на тот, в вашем посте, вы могли бы сделать что-то вдоль линий:

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       objects: [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 

Однако, поскольку ваш пример URL содержит объект JSON, кажется более вероятным, что API вы работа с поиском запроса POST.

post_response = Typhoeus::Request.post("http://www.example.com/objects/add.php", params: my_params) 
post_response.effective_url #> http://www.example.com/objects/add.php 
post_response.request.params #> {:api_key=>"XXXXXXXXXXXXXXXXXX", :objects=>[{:field1=>"My ObjectA2"}, {:field=>"ObjectB", :color=>"1", :note=>"98765"}], :ids=>"foo, bar"} 

EDIT:

В том случае, если API который ожидает запрос GET, в настоящее время наиболее распространенным способом, чтобы передать сериализованные данные через запросы GET, чтобы добавить квадратные скобки в конце имен параметров :

http://www.example.com/objects/add.php?objects[]=something&objects[]=something%20else 

Однако Typhoeus по умолчанию не добавляет скобки. Существует некоторая дискуссия on the Typhoeus mailing list, в которой обосновывается это решение. К счастью, вы можете легко добавить скобки самостоятельно:

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       :"objects[]" => [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects%5B%5D=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects%5B%5D=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 
Смежные вопросы