Запрос данных из API с использованием Net :: HTTP до входа пользователя в систему? - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь интегрировать свое приложение Ruby on Rails с CheddarGetter, используя размещенные на них платежные страницы (http://support.cheddargetter.com/kb/hosted-payment-pages/hosted-payment-pages-setup-guide).

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

Очевидно, что это своего рода HTTP-запрос, который, честно говоря, я совсем не знаком, извините. Вот код:

uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
status = http.request(request).body

Мне интересно, куда именно я помещаю этот код?

Я думаю, поместите в мою user_session.rb модель следующее:

class UserSession < Authlogic::Session::Base
  before_create :check_status

  private
  def check status
      # insert above code here
  end
end

Но я не слишком уверен ..? Я подозреваю, что там также должен быть какой-то if active? elsif cancelled? && pending? код, ссылающийся на ответ, который даст вам CheddarGetter API ..

Буду признателен за направление, спасибо ..

1 Ответ

1 голос
/ 22 декабря 2011

Я бы порекомендовал поместить его в свой собственный модуль в каталог /lib, а также обернуть вызов в Timeout на случай, если веб-сайт, к которому вы пытаетесь получить доступ, недоступен. Я только что сделал общий пример ниже, чтобы вы могли настроить время по мере необходимости.

Внутри /lib/customer_status.rb

require 'timeout'
module CustomerStatus
  class << self
    def get_status
      begin
        Timeout::timeout(30) {
          uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode")
          http = Net::HTTP.new(uri.host, uri.port)
          http.use_ssl = true
          http.verify_mode = OpenSSL::SSL::VERIFY_NONE
          request = Net::HTTP::Get.new(uri.request_uri)
          status = http.request(request).body
        } # end timeout

        return status

      rescue Exception => e
        # This will catch a timeout error or any other network connectivity error
        Rails.logger.error "We had an error getting the customer's status: #{e}"
      end
    end
  end
end

Тогда вы можете просто назвать это так:

class UserSession < Authlogic::Session::Base
  # include the new module we added
  include CustomerStatus

  before_create :check_status

  private
  def check status
    raise someError unless (CustomerStatus.get_status.include?("active"))
  end
end

Я позволю вам добавить другую логику для состояний cancelled, pending и т. Д., А также передать информацию о клиенте в новый метод модуля. Вы можете просто использовать оператор switch для обработки различных состояний.


Обновление

Кроме того, если у вас его еще нет в файле config/application.rb, обязательно включите его, чтобы он добавил папку lib в путь автозагрузки:

module YourAppNameGoesHere
  class Application < Rails::Application

    # Custom directories with classes and modules you want to be autoloadable.
    config.autoload_paths += %W(#{config.root}/lib)

  end
end
...