我有以下代码
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库但是因为我已经花了一些时间对它进行编码,所以如何使它与法拉第
一起使用会很好答案 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