【问题标题】:How to avoid Faraday request to encode get parameters?如何避免法拉第请求编码获取参数?
【发布时间】:2014-01-22 12:48:04
【问题描述】:

我有以下代码

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 参数以这种方式编码,如日志中所示 key=xxxxx%257xxxxxxxxx%252xxxx%253xxxx-xxxx,导致 mapquest API 响应使用无效的密钥(由于我尝试使用邮递员的编码并且它有效)

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"

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

我正在使用 Faraday 0.9.0,ruby 2.0。我知道我可以使用依赖于 restclient gem 的 mapquest 库,但是由于我花了一些时间对此进行编码,因此如何使其与 faraday

一起使用会很好

【问题讨论】:

  • 你能解决这个问题吗?
  • 很抱歉,回复太晚了,不知道为什么我没有收到任何通知。我能够解决它。我认为伊恩的答案是正确的

标签: ruby-on-rails ruby mapquest faraday


【解决方案1】:

这只是部分答案:

可以创建自己的 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 以获取代码示例。

【讨论】:

    【解决方案2】:

    在你需要法拉第之后添加这个。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 2018-07-01
      • 2019-01-31
      • 2019-08-03
      • 2016-07-29
      • 2016-12-12
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多