在用户登录之前使用Net :: HTTP从API请求数据?

时间:2011-12-22 15:43:19

标签: ruby-on-rails recurring-billing net-http

我正在尝试使用托管的付款页面(http://support.cheddargetter.com/kb/hosted-payment-pages/hosted-payment-pages-setup-guide)将我的Ruby on Rails应用程序与CheddarGetter集成。

除了最后一部分之外,我几乎已经弄明白了 - 根据他们的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 个答案:

答案 0 :(得分:1)

我建议将其放在/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

我将允许您为cancelledpending等状态添加其他逻辑,并将客户信息传递给新模块方法。您可能只想使用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