Я разработал приложение, которое позволяет нашим клиентам создавать свои собственные сайты, защищенные веб-сайтом. Затем мое приложение подключается к внешней API-службе (клиентский api_key/api_url) для синхронизации/обновления/добавления данных в эту другую службу. Ну, у меня была обертка API, написанная для этой другой службы, которая доработала до этого момента. Тем не менее, теперь я вижу очень случайные капли, когда соединение равно нулю. Вот как я сейчас использую соединение:
У меня есть класс соединения xml/rpc
class ApiConnection
attr_accessor :api_url, :api_key, :retry_count
def initialize(url, key)
@api_url = url
@api_key = key
@retry_count = 1
end
def api_perform(class_type, method, *args)
server = XMLRPC::Client.new3({'host' => @api_url, 'path' => "/api/xmlrpc", 'port' => 443, 'use_ssl' => true})
result = server.call("#{class_type}.#{method}", @api_key, *args)
return result
end
end
У меня также есть модуль, который я могу включить в мои модели для доступа и вызова методов api
module ApiService
# Set account specific ApiConnection obj
def self.set_account_api_conn(url, key)
if ac = Thread.current[:api_conn]
ac.api_url, ac.api_key = url, key
else
Thread.current[:api_conn] = ApiConnection.new(url, key)
end
end
########################
### Email Service ###
########################
def api_email_optin(email, reason)
# Enables you to opt contacts in
Thread.current[:api_conn].api_perform('APIEmailService', 'optIn', email, reason)
end
### more methods here ###
end
Затем в контроллере приложения я создаю новый объект Apiconnection для каждого запроса с использованием фильтра before, который устанавливает Thread.current [: api_conn]. Это связано с тем, что у меня есть сотни клиентов, каждый из которых имеет свои собственные api_key и api_url, используя приложение одновременно.
# In before_filter of application controller
def set_api_connection
Thread.current[:api_conn] = ApiService.set_account_api_conn(url, key)
end
Хорошо, мой вопрос в том, что я читал, что использование Thread.current
- не самый идеальный способ справиться с этим, и мне интересно, является ли это причиной того, что ApiConnection будет nil на случайных запросах. Поэтому я хотел бы знать, как лучше настроить эту оболочку.