добавление параметров в промежуточное ПО Фарадея

Я пытаюсь написать промежуточное программное обеспечение, которое будет устанавливать дополнительные параметры для строки запроса. Вариант использования состоит в том, чтобы иметь возможность добавлять дополнительные токены аутентификации, например, к запросу, как того требует серверная часть, но желая внедрить его независимо от создания самого запроса.

Вот как выглядит мое промежуточное ПО (псевдокод):

class MyMiddleware < Struct.new(:app, :key, :value) 
  def call(env)
    env.params[key] = value #1
    #env.params = {key => value} #2
    app.call env
  end
end
  1. выше вызывает NoMethodError (неопределенный метод[]=' для nil:NilClass)`
  2. выше устанавливает хэш параметров, но параметр не кодируется как часть строки запроса. Строка запроса остается такой же, какой она была до того, как ПО промежуточного слоя начали обрабатывать запрос.

Мой анализ заключается в том, что, поскольку строка запроса создается из параметров вack_builder.rb:191

def build_response(connection, request)
  app.call(build_env(connection, request))
end

def build_env(connection, request)
  Env.new(request.method, request.body,
    connection.build_exclusive_url(request.path, request.params), #<== rack_builder.rb:191
    request.options, request.headers, connection.ssl,
    connection.parallel_manager)
end

Промежуточное программное обеспечение не имеет возможности устанавливать дополнительные параметры. Хотя у env есть свойство params, оно равно нулю и, по-видимому, не затрагивается во время или после вызова промежуточного программного обеспечения.

Итак, у меня есть следующие вопросы: 1. Есть ли поддерживаемый способ добиться этого? 2. Если нет, есть ли способ перестроить строку запроса как часть выполнения промежуточного программного обеспечения? 3. Не лучше ли отложить построение URL-адреса до того, как будет выполнена большая часть цепочки промежуточного программного обеспечения запроса (но, конечно, до того, как адаптер сделает свое дело или сделает это в адаптере)? 4. Есть еще варианты?

Цените любое руководство.


person gentwo    schedule 26.06.2015    source источник


Ответы (1)


Ответ здесь, на github: https://github.com/lostisland/faraday/issues/483 от @mislav

Внутри промежуточного ПО URL-адрес запроса уже полностью сформирован вместе со всеми настроенными параметрами запроса в виде строки. Единственный способ добавить или удалить параметры запроса — отредактировать строку env.url.query, например:

MyMiddleware = Struct.new(:app, :token) do
  def call(env)
    env.url.query = add_query_param(env.url.query, "token", token)
    app.call env
  end

  def add_query_param(query, key, value)
    query = query.to_s
    query << "&" unless query.empty?
    query << "#{Faraday::Utils.escape key}=#{Faraday::Utils.escape value}"
  end
end

conn = Faraday.new "http://example.com" do |f|
  f.use MyMiddleware, "MYTOKEN"
  f.adapter :net_http
end

Однако, если ваше промежуточное ПО будет похоже на MyMiddleware, описанное выше, и просто добавите статический параметр запроса ко всем запросам, гораздо более простой подход — отказаться от промежуточного ПО и просто настроить экземпляр соединения Фарадея для применения одного и того же параметра запроса ко всем запросам:

conn = Faraday.new "http://example.com" do |f|
  f.params[:token] = "MYTOKEN"
  f.adapter :net_http
end
person abookyun    schedule 31.03.2016