I have the following code
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
Unfortunately the key param gets encoded as shown in the log in this way key=xxxxx%257xxxxxxxxx%252xxxx%253xxxx-xxxx, causing that the mapquest API respond to with an invalid key (due to the encoding as i tried with postman and it works)
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"
The key param should be send without encoding the %, how can i avoid that this doesnt happen, i haven't found any parameter to change this behavior
Im using Faraday 0.9.0, ruby 2.0. I know i can use the mapquest library that relies on restclient gem but as i ve spent some time coding this it would be nice how to make it work with faraday
This is only a partial answer:
It is possible to create your own param_encorder to avoid the value field from being escaped. This get used here (see method 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
But !! The query string fails the query text check (see check_query method) ruby-2.0.0-p247/lib/ruby/2.0.0/uri/generic.rb
I suspect that it is failing due to something else. Is the site using CSRF or do you need to capture the cookie and include that in your request.
If you need to use CSRF check out https://gist.github.com/chrisZingel/9042812 for a code example.
Add this after you've required faraday.
module Faraday
module NestedParamsEncoder
def self.escape(arg)
arg
end
end
module FlatParamsEncoder
def self.escape(arg)
arg
end
end
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With