Добавьте поля данных в запрос оставшегося клиента в Ruby

У меня возникли проблемы с отправкой запроса к uber API с помощью драгоценного камня rest-client. Я считаю, что проблема в том, что я пытаюсь передать необходимую информацию в качестве параметров в URL-адресе вместо поля данных. Пример запроса curl имеет эти параметры после -d, но я не знаю, как реализовать это с помощью rest-client. Спасибо за помощь.

Этот запрос работает в консоли:

curl -v -H "Authorization: Bearer " + session[:request_token] \
     -H "Content-Type: application/json" -X POST -d \ '{"start_latitude":"37.334381","start_longitude":"-121.89432","end_latitude":"37.77703","end_longitude":"-122.419571","product_id":"a1111c8c-c720-46c3-8534-2fcdd730040d"}' \
https://sandbox-api.uber.com/v1/requests

Запрос от моего контроллера, который получает ошибку 406, неприемлемый ответ.

@uber_ride = JSON.load(RestClient::Request.execute(
  :method => :post,
  :url => "https://sandbox-api.uber.com/v1/sandbox/requests/product_id=#{@uberx_id}?start_latitude=#{lat_start}&start_longitude=#{lng_start}&end_latitude=#{lat_end}&end_longitude=#{lng_end}",
  :headers => {'Authorization' => 'Bearer ' + session[:request_token], 'content_type' => 'application/json'}
))  

Я попытался добавить дополнительное поле для data, но это дает ошибку 404 Resource Not Found.

@uber_ride = JSON.load(RestClient::Request.execute(
  :method => :post,
  :url => "https://sandbox-api.uber.com/v1/sandbox/requests/",
  :data => {'start_latitude' => lat_start, 'start_longitude' => lng_start, 'end_latitude' => lat_end, 'end_longitude' => lng_end, 'product_id' => @uberx_id},
  :headers => {'Authorization' => 'Bearer ' + session[:request_token]},
  :content_type => :json
))  

person tylerSF    schedule 24.04.2015    source источник
comment
:payload => {'start_latitude' => lat_start, 'start_longitude' => lng_start, 'end_latitude' => lat_end, 'end_longitude' => lng_end, 'product_id' => @uberx_id} вместо :data => {} должно помочь.   -  person Aleksei Matiushkin    schedule 24.04.2015
comment
@mudasobwa, спасибо за помощь. Это помогло исправить часть этого. Я добавил окончательный запрос, который работает ниже, как ответ.   -  person tylerSF    schedule 25.04.2015


Ответы (1)


Наконец-то я заработал. Спасибо @mudasobwa за рекомендацию изменить data => на payload =>. Мне также пришлось добавить одинарные кавычки вокруг объекта полезной нагрузки, чтобы гем rest-client не преобразовал его из json. пример: '{}'. Наконец, мне пришлось изменить способ указания типа контента и указать его в :headers как :content_type, а НЕ 'Content-Type'. См. ниже окончательный запрос, который сейчас работает. Это немного запутанно с переменными .to_s, но через 5 часов это единственный вызов, который я смог заставить работать.

@uber_ride = (RestClient::Request.execute(
  :method => :post,
  :url => "https://sandbox-api.uber.com/v1/requests",
  :payload => '{"start_latitude":' + lat_start.to_s + ',"start_longitude":' + lng_start.to_s + ',"end_latitude":' + lat_end.to_s + ',"end_longitude":' + lng_end.to_s + ',"product_id":"' + @uberx_id.to_s + '"}',
  :headers => {'Authorization' => 'Bearer ' + session[:request_token], :content_type => 'application/json'}
))  

Рад слышать любые отзывы о том, как я мог бы очистить это.

person tylerSF    schedule 25.04.2015
comment
Извините, что не упомянул кавычки, я набрал сообщение в спешке. Для строки просто используйте встроенную функцию ruby ​​%{}: %{"start_latitude":#{lat_start}, ...}. - person Aleksei Matiushkin; 25.04.2015