1

私のプロジェクトでは、外部サービスと対話するために次の小さなライブラリを使用しています:

class ExternalServiceInteraction
  include Singleton

    URL = Rails.env.production? ? 'https://first.production.url.com' : 'http://sandbox.url.com'
    API_KEY = Rails.env.production? ? 'qwerty' : 'qwerty'
    DOMAIN = Rails.env.production? ? 'prod.net' : 'stage.net'

  def connection
    conn = Faraday.new(url: URL) do |faraday|
      faraday.response :logger                  # log requests to STDOUT
      faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
    end
  end

  def return_response(item=true)
    if @resp.status == 200
      response = item ? Hash.from_xml(@resp.body)['xml']['item'] : Hash.from_xml(@resp.body)['xml']
    else
      response =  Hash.from_xml(@resp.body)['xml']['error']
      Rails.logger.info "response_error=#{response}"
    end
    response
  end

  def get_subscribers
    path = 'subscribers'
    data = { 'X-API-KEY' => API_KEY, 'domain' => DOMAIN }
    @resp = connection.get(path, data)
    return_response
  end

  def get_subscriber(physical_id)
    path = 'subscriber'
    data = { 'X-API-KEY' => API_KEY, 'Physical_ID' => physical_id, 'domain' => DOMAIN }
    @resp = connection.get(path, data)
    return_response
  end
  # and so on
end

最初の URL を介した対話サービスでエラーが発生した場合、「https://second.production.url.com」を使用したいのですが、これを設定するにはどうすればよいですか?

最初に、サーバーから ping / get 200 ok を試みましたが、これが失敗した場合は、2 番目の URL に切り替えます。ただし、サーバーが稼働中で、200 OK を返しても、API に到達できない場合があります。私の主な問題は、エラーをキャッチしてライブラリの別の URL でメソッドを再実行する方法がわからないことです。

4

2 に答える 2

1

ExternalServiceInteractionWithoutFallbackコンストラクターでURLを受け入れるを作成します。次に、すべてのAPIメソッドをこのメソッドに移動し、の「アクティブな」インスタンスでExternalServiceInteractionすべてのAPIメソッドをキャッチして委任します。呼び出しが失敗した場合は、委任先のインスタンスを変更します。method_missingExternalServiceInteractionWithoutFallback

于 2013-01-11T15:31:45.600 に答える