Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid Faraday request to encode get parameters?

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

like image 723
Carlos Herrera Parra Avatar asked Jan 22 '14 12:01

Carlos Herrera Parra


2 Answers

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.

like image 118
chrisz Avatar answered Oct 31 '22 22:10

chrisz


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
like image 45
Ian Kelling Avatar answered Oct 25 '22 16:10

Ian Kelling