How to avoid Faraday request to encode get parameters?
Asked Answered
H

2

9

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

Hightail answered 22/1, 2014 at 12:48 Comment(2)
Were you able to solve this?Clarendon
sorry for the super late reply not sure why i didn't receive any notification. i was able to solve it. I think Ian's answer is the correct oneHightail
C
7

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.

Cadmium answered 9/3, 2014 at 21:27 Comment(0)
C
0

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
Cerecloth answered 24/2, 2015 at 2:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.