在Ruby中将数据字段添加到rest-client请求

时间:2015-04-24 14:18:24

标签: ruby rest-client uber-api

我无法使用rest-client gem向uber api发出请求。我认为问题是我试图将所需信息作为参数传递给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资源未找到错误。

@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
))  

1 个答案:

答案 0 :(得分:4)

我终于开始工作了。感谢@mudasobwa建议将data =>更改为payload =>。我还必须在有效负载对象周围添加单引号,以便rest-client gem不会将其转换为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'}
))  

很高兴听到有关我如何清理它的任何反馈。