Каков наилучший способ расширить HTTParty RestClient для определенных вызовов API с persistent_http? - PullRequest
0 голосов
/ 09 октября 2019

В настоящее время мы используем HTTParty gem для нашего класса RestClient в нашем Rails Engine. Недавно мы использовали оболочку persistent_httparty , чтобы добавить возможность устанавливать тайм-ауты чтения и тайм-ауты открытия. Это позволяет нам затем реализовать нашу собственную пользовательскую обработку для длинных вызовов API.

Наш код выглядит следующим образом для класса RestClient:

require 'httparty'
require 'persistent_httparty'

module ScheduleEngine
  class RestClient
    include HTTParty

    pool_size = 10
    idle_timeout = 10
    keep_alive = 10
    read_timeout = 3
    open_timeout = 3

    persistent_connection_adapter(pool_size: pool_size, idle_timeout: idle_timeout, keep_alive: keep_alive,
                                  read_timeout: read_timeout, open_timeout: open_timeout)

    class << self
      # other stuff
    end

    # other code omitted for brevity
  end
end

Затем, чтобы использовать этот RestClient, мы просто создаем экземплярRestClient, где когда-либо нам нужно сделать вызов API.

client = RestClient.new(user, params)

data = client.callAPI()

Теперь мы хотим, чтобы некоторые конкретные вызовы API не имели тайм-аута чтения или открытого тайм-аута.

Я не эксперт по Rubyно моя первоначальная идея заключается в создании нового класса, который наследуется от класса RestClient. Но этот просто перезапишет некоторые из базовых значений. Ниже приведен пример:

module ScheduleEngine
  class SpecialRestClient < RestClient
    pool_size = 10
    idle_timeout = 10
    keep_alive = 10

    # Note that I'm no longer providing read_timout or open_timeout
    persistent_connection_adapter(pool_size: pool_size, idle_timeout: idle_timeout, keep_alive: keep_alive)
  end
end

С помощью этого нового класса я могу просто создать его экземпляр в тех местах, где я не хочу, чтобы тайм-аут чтения или открытый тайм-аут.

Мой вопрос таков:это хороший подход? Или есть еще лучший подход?

Обновление: вот моя вторая попытка. Просмотр документации для persistent_httparty, особенно в отношении класса ConnectionAdapter , показывает, что я могу передать ключ с именем timeout и, если я это укажу, он перезапишет существующие значения для read_timeout и open_timeout. Мой новый код выглядит так:

module ScheduleEngine
  class SpecialRestClient < RestClient
    persistent_connection_adapter(timeout: 90)
  end
end

Я попробовал это, и это не сработало. Это заставляет меня думать, что метод persistent_connection_adapter должен вызываться только один раз в начале, и как только он установлен, вы не можете изменять какие-либо настройки.

Ответы [ 2 ]

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

Учитывая способ работы HTTParty, я не уверен, что то, что вы предлагаете, сработает. Кажется, что из краткого прогона базы кода, вызывая read_timeout, open_timeout и т. Д., Вы устанавливаете параметры по умолчанию, а затем, когда вы передаете параметры в
persistent_connection_adapter, они просто объединяются в"default_options"

Это означает, что даже если вы удалили вызовы методов для read_timeout и open_timeout из новых классов, есть вероятность, что они все еще будут передаваться по наследству.

Возможно, имеет смысл настроить только параметры по умолчанию, а затем передать параметры переменной в persistent_connection_adapter. Например:

 class RestClient
   include HTTParty
   pool_size = 10
   idle_timeout = 10
   keep_alive = 10
   persistent_connection_adapter(read_timeout: 3, open_timeout: 3)
end 

Это означает, что вы можете наследовать при настройке параметров подключения для этого. определенный класс:

 class SpecialRestClient < RestClient
   persistent_connection_adapter
 end 
0 голосов
/ 09 октября 2019

как насчет добавления сюда инициализатора, который займет хеш таймаутов? например:

def initialize(timeouts = {})
@timeouts = timeouts
end

def call
persistent_connection_adapter({pool_size: 10, idle_timeout: 10, keep_alive: 10}.merge(timeouts))
end

private attr_reader: timeouts

, поэтому, если вы хотите установить тайм-ауты, которые вы просто определяете при инициализации.

вызов - это просто функция, вызываемая после инициализации

...