如何避免法拉第请求编码获取参数?

时间:2014-01-22 12:48:05

标签: ruby-on-rails ruby mapquest faraday

我有以下代码

conn = Faraday.new(:url => 'http://www.mapquestapi.com') do |faraday|
 faraday.response :logger                  # log requests to STDOUT
 faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
 faraday.options.params_encoder = Faraday::FlatParamsEncoder
end

response = conn.get do |req|
   req.url '/geocoding/v1/batch'
   req.params['key'] = 'xxxxx%7xxxxxxxxx%2xxxx%3xxxx-xxxx'
   req.params['location'] = addresses[0]
end

不幸的是,密钥参数以这种方式编码,如日志所示 key = xxxxx%257xxxxxxxxx%252xxxx%253xxxx-xxxx ,导致mapquest API响应使用无效密钥(由于编码,因为我尝试使用postman并且它有效)

I, [2014-01-22T19:16:17.949640 #93669]  INFO -- : get http://www.mapquestapi.com/geocoding/v1/batch?key=xxxxx%257xxxxxxxxx%252xxxx%253xxxx-xxxx&location=1047+East+40th+Avenue%2C+Vancouver%2C+BC+V5W+1M5%2C+Canada
D, [2014-01-22T19:16:17.949778 #93669] DEBUG -- request: User-Agent: "Faraday v0.9.0"
accept-encoding: ""
I, [2014-01-22T19:16:19.038914 #93669]  INFO -- Status: 200
D, [2014-01-22T19:16:19.039043 #93669] DEBUG -- response: server: "Apache-Coyote/1.1"
set-cookie: "JSESSIONID=AD0A86636DAAD3324316A454354F; Path=/; HttpOnly"

密钥参数应该在不编码的情况下发送,我怎样才能避免这种情况发生,我没有找到任何参数来改变这种行为

我使用法拉第0.9.0,红宝石2.0。我知道我可以使用依赖于restclient gem的mapquest库但是因为我已经花了一些时间对它进行编码,所以如何使它与法拉第

一起使用会很好

2 个答案:

答案 0 :(得分:4)

这只是部分答案:

可以创建自己的param_encorder以避免值字段被转义。这在这里使用(参见方法build_exclusive_url) ruby-2.0.0-p247@zingtech/gems/faraday-0.9.0/lib/faraday/connection.rb

class DoNotEncoder
  def self.encode(params)
    buffer = ''
    params.each do |key, value|
      buffer << "#{key}=#{value}&"
    end
    return buffer.chop
  end
end

conn = Faraday.new(:url => 'http://www.mapquestapi.com') do |faraday|
 faraday.response :logger                  # log requests to STDOUT
 faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
 #faraday.options.params_encoder = Faraday::FlatParamsEncoder
 faraday.options.params_encoder = DoNotEncoder
end

但是!! 查询字符串未通过查询文本检查(请参阅check_query方法) ruby-2.0.0-p247 / lib / ruby​​ / 2.0.0 / uri / generic.rb

我怀疑它因其他原因而失败。该网站是使用CSRF还是您需要捕获cookie并将其包含在您的请求中。

如果您需要使用CSRF,请查看https://gist.github.com/chrisZingel/9042812以获取代码示例。

答案 1 :(得分:2)

在您需要法拉第后添加此内容。

module Faraday
  module NestedParamsEncoder
    def self.escape(arg)
      arg
    end
  end
  module FlatParamsEncoder
    def self.escape(arg)
      arg
    end
  end
end