Как использовать квадратные скобки [] в URI в Ruby HTTP-запросе - PullRequest
1 голос
/ 09 января 2012

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

"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 без URL-кодировки в квадратных скобках?

РЕДАКТИРОВАТЬ : Этот SO-ответ выглядел многообещающе, но я не совсем уверен, как мне следует изменить патч для обезьян, чтобы соответствовать этому примеру.

Как мне использовать метод URI.parse обезьяны-патча

1 Ответ

1 голос
/ 11 января 2012

Typhoeus позволяет передавать параметры HTTP с использованием конструкций Ruby.Чтобы создать URL-адрес, аналогичный 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"}

РЕДАКТИРОВАТЬ:

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

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

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

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
...