Как избежать запроса Фарадея для кодирования параметров получения?

У меня есть следующий код

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, в результате чего API mapquest отвечает недопустимым ключ (из-за кодировки, как я пробовал с почтальоном, и он работает)

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. Я знаю, что могу использовать библиотеку mapquest, которая опирается на гем restclient, но, поскольку я потратил некоторое время на ее кодирование, было бы неплохо, как заставить ее работать с faraday


person Carlos Herrera Parra    schedule 22.01.2014    source источник
comment
Вы смогли это решить?   -  person tomascharad    schedule 03.11.2014
comment
извините за очень поздний ответ, не знаю, почему я не получил никакого уведомления. я смог решить это. Я думаю, что ответ Яна правильный   -  person Carlos Herrera Parra    schedule 18.08.2015


Ответы (2)


Это только частичный ответ:

Можно создать свой собственный 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. для примера кода.

person chrisz    schedule 09.03.2014

Добавьте это после того, как вам потребуется Фарадей.

module Faraday
  module NestedParamsEncoder
    def self.escape(arg)
      arg
    end
  end
  module FlatParamsEncoder
    def self.escape(arg)
      arg
    end
  end
end
person Ian Kelling    schedule 24.02.2015