Фарадей меняет мои заголовки с прописных на прописные - PullRequest
1 голос
/ 18 октября 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. Можно ли предотвратить это?

Спасибо.

1 Ответ

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

Вы можете изменить ключи на строки, но тогда вы обнаружите, что Net :: HTTP меняет ключи на: Api_signature и Api_request_time. Для получения дополнительной информации см. Здесь: https://github.com/lostisland/faraday/issues/747#issuecomment-439864181

Один из способов обойти это, хотя и немного странно, - создать класс String, который сам по себе не должен быть в нижнем регистре, например:

class UpperCaseString < String
  def downcase
    self
  end
end

Затем определите ваши заголовки следующим образом:

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

Возможно, лучше использовать другой адаптер, например, patron. Добавьте его в свой Gemfile, затем настройте запрос на его использование:

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

В этом случае вам все равно нужно убедиться, что ваши заголовки - это строки, а не символы:

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