Ruby - заголовки ответов доступа для ограничения скорости (Help Scout)

Я использую рубиновый драгоценный камень helpscout и пытаюсь проверить, когда лимит запросов меньше определенного числа (т.е. осталось 2 запроса), и засыпаю цикл на оставшийся интервал, чтобы разрешить сброс лимита скорости.

Есть ли способ получить доступ к заголовкам ответов из API при выполнении запроса? https://developer.helpscout.com/help-desk-api/#basic-rate-limiting

X-RateLimit-Interval-*  Length of the rate limiting interval in seconds

X-RateLimit-Limit-* Maximum number of requests per interval

X-RateLimit-Remaining-* Number of requests remaining in the current rate limit interval

Интерком (https://developers.intercom.com/reference#rate-limiting) позволяет ваш, чтобы проверить rate_limit_details и вернуть заголовки, но я не могу найти ничего для Help Scout или понять, как получить к ним доступ.

intercom.rate_limit_details
#=> {:limit=>180, :remaining=>179, :reset_at=>2014-10-07 14:58:00 +0100}

person VegaStudios    schedule 11.02.2018    source источник


Ответы (1)


Проблема в том, что helpscout драгоценный камень не фиксирует эту информацию. Если вы посмотрите исходный код

https://github.com/hramos/helpscout/blob/db8da936853c8df694186ab11100d4482f74d302/lib/helpscout/models.rb#L44

  # Error Envelope
  class ErrorEnvelope
    attr_reader :status, :message

    # Creates a new ErrorEnvelope object from a Hash of attributes
    def initialize(object)
      @status = object["status"]
      @message = object["message"]
    end
  end

При возникновении ошибки они захватывают только status и message. Вы можете расширить класс ниже, если хотите захватить дополнительные значения заголовка.

  # Error Envelope
  class ErrorEnvelope
    attr_reader :status, :message, :limit

    # Creates a new ErrorEnvelope object from a Hash of attributes
    def initialize(object)
      @status = object["status"]
      @message = object["message"]
      @limit = object["header"]["X-RateLimit-...."]
    end
  end

Но это покажет вам пределы только тогда, когда вы получите сообщение об ошибке. Вы можете дополнительно расширить библиотеку, чтобы фиксировать эти ограничения для каждого вызова. Вам нужно будет изменить client.rb

https://github.com/hramos/helpscout/blob/2449bc2604667edfca5ed934c8e61cd129b17af5/lib/helpscout/client.rb

module HelpScout
  class Client
    include HTTParty
    @@last_headers

    def self.get(*more)
        response = HTTParty.get(*more)
        @@last_headers = response.headers
        return response
    end

    def self.last_headers
        @@last_headers
    end

    ....
    ....
 end

Таким образом, выполнение HelpScout.last_headers даст вам заголовки из последнего ответа, а затем вы сможете захватить любое поле, которое вам нужно, из того же

person Tarun Lalwani    schedule 17.02.2018