2014-01-22 2 views
6

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

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 

К сожалению ключ парам будет закодирован как показано в журнале таким образом ключ = ххххх% 257xxxxxxxxx% 252xxxx% 253xxxx-хххх, в результате чего, что MapQuest API ответить чтобы с неправильным ключом (из-за кодирования, как я попытался с почтальоном и он работает)

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" 

ключ парам следует отправить без кодирующая %, как я могу избежать этого этого не произошло, я не нашел параметров, чтобы изменить это поведение

Im using Faraday 0.9.0, ruby ​​2.0. Я знаю, что я могу использовать библиотеку Mapquest, которая опирается на restclient драгоценный камень, но, как я ве провел некоторое время кодирования это было бы неплохо, как заставить его работать с Фарадея

+1

Вы смогли это решить? – tomascharad

+1

извините за супер поздно ответ не уверен, почему я не получил никаких уведомлений. я смог его решить. Я думаю, что ответ Яна правильный –

ответ

3

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

Вы можете создать свой собственный param_encorder, чтобы избежать экранирования поля значения. Это привыкают здесь (см метод build_exclusive_url) [email protected]/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) рубиново-2.0.0-P247/Библиотека/рубин/2.0.0/URI/generic.rb

Я подозреваю, что это из-за неудачу на что-то другое , Является ли сайт использующим CSRF или вам нужно захватить файл cookie и включить его в свой запрос.

Если вам нужен CSRF, ознакомьтесь с кодом https://gist.github.com/chrisZingel/9042812 для примера кода.

2

Добавьте это после того, как вам понадобится faraday.

module Faraday 
    module NestedParamsEncoder 
    def self.escape(arg) 
     arg 
    end 
    end 
    module FlatParamsEncoder 
    def self.escape(arg) 
     arg 
    end 
    end 
end 
+0

Это должен быть правильный ответ. –

Смежные вопросы