Как использовать адаптер, чтобы Фарадей не поменял заглавные буквы - PullRequest
0 голосов
/ 19 октября 2019

Я использую Фарадей для создания SDK, который будет взаимодействовать с API, и мне нужно отправить два заголовка API_SIGNATURE и API_REQUEST_TIME, вот что я создал:

class APIClient
  def initialize(api_key)
    @api_key = api_key
  end

  def get_users
    request.post('/users')
  end

  private

  def request
    Faraday.new(@@BASE_API_URL, headers: headers)
  end

  def headers
    timestamp = Time.now.to_i.to_s
    return {
      'API_SIGNATURE': Digest::MD5.hexdigest(@api_key + timestamp),
      'API_REQUEST_TIME': timestamp
    }
  end
end

И для некоторыхпричина, по которой Фарадей меняет API_SIGNATURE на Api-Signature и API_REQUEST_TIME на Api-Request-Time.

Я хотел бы предотвратить это. Кто-то предложил использовать патрона:

  def request
    Faraday.new(@@BASE_API_URL, headers: headers) do |faraday|
      faraday.adapter :patron
    end
  end

Но это не работает. Возникает следующая ошибка:

/Users/me/.rvm/gems/ruby-2.4.9/gems/patron-0.13.3/lib/patron/session.rb:330:in `handle_request': Operation timed out after 1004 milliseconds with 0 out of 0 bytes received (Faraday::TimeoutError)
        from /Users/me/.rvm/gems/ruby-2.4.9/gems/patron-0.13.3/lib/patron/session.rb:330:in `request'
        from /Users/me/.rvm/gems/ruby-2.4.9/gems/faraday-0.17.0/lib/faraday/adapter/patron.rb:29:in `call'
        from /Users/me/.rvm/gems/ruby-2.4.9/gems/faraday-0.17.0/lib/faraday/rack_builder.rb:143:in `build_response'
        from /Users/me/.rvm/gems/ruby-2.4.9/gems/faraday-0.17.0/lib/faraday/connection.rb:387:in `run_request'
        from /Users/me/.rvm/gems/ruby-2.4.9/gems/faraday-0.17.0/lib/faraday/connection.rb:175:in `post'
        from api.rb:32:in `analyze_text'
        from api.rb:38:in `full_analysis'
        from api.rb:65:in `<main>'

Спасибо.

======= Обновление ==========

Проблемауменьшено:

headers = { API_SIGNATURE: '', API_REQUEST_TIME: '' }

conn = Faraday.new('https://api.test.io', headers: headers) do |f|
  f.adapter :patron
end

puts conn.headers

1 Ответ

1 голос
/ 19 октября 2019

Эта ошибка возникает из-за того, что Фарадей по умолчанию использует Net :: HTTP, а Net :: HTTP изменяет регистр ключей заголовка . Вы можете прочитать больше об этой проблеме в этот связанный вопрос .

Вы можете обойти это, используя один из других доступных адаптеров, перечисленных в https://lostisland.github.io/faraday/adapters/:

Или внешние адаптеры, для которых требуется другой драгоценный камень:

Ваша конкретная реализация Patron выглядит правильно, поэтому попробуйте использовать один из других адаптеров, чтобы узнать, повезет ли вам больше.

Обновление

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

# symbolized
headers = { API_SIGNATURE: '', API_REQUEST_TIME: '' }
=> {
       :API_SIGNATURE => "",
    :API_REQUEST_TIME => ""
}

Это возвращает:

puts conn.headers
{"Api-Signature"=>"", "Api-Request-Time"=>"", "User-Agent"=>"Faraday v0.17.0"}

против:

# stringified
headers = { 'API_SIGNATURE' => '', 'API_REQUEST_TIME' => '' }
=> {
       "API_SIGNATURE" => "",
    "API_REQUEST_TIME" => ""
}

Теперь вы получите правильные значения:

puts conn.headers
{"API_SIGNATURE"=>"", "API_REQUEST_TIME"=>"", "User-Agent"=>"Faraday v0.17.0"}

На первый взгляд, ваш оригинальный пример выглядит строковым, но не является (поэтому я его не уловил):

{
  'API_SIGNATURE': '',
  'API_REQUEST_TIME': ''
}
=> {
       :API_SIGNATURE => "",
    :API_REQUEST_TIME => ""
}

Использование двоеточия для хешаКлюч в Ruby автоматически делает его символом, даже если это строка в кавычках. Вам нужно использовать синтаксис хеш-ракеты для строковых ключей.

...