【问题标题】:How do you log the URL ActiveResource uses?您如何记录 ActiveResource 使用的 URL?
【发布时间】:2011-04-09 12:04:25
【问题描述】:

Rails ActiveResource 很棒......除了一件事:据我所知,没有办法看到它在幕后使用的 URL。例如,假设我有一个名为 Issue 的 ActiveResource,用于 myIssues.com/issues.xml 上的 Web 服务。如果我这样做:

Issue.find(:all, :params => {:page => 2})

我希望 ActiveResource 会调用:

myIssues.com/issues.xml?page=2

...但我实际上并不知道。据我所知,ActiveResource 可能认为它不喜欢“页面”这个词,所以它实际上是在使用:

myIssues.com/issues.xml?mod_page=2

这使得调试变得困难。现在我遇到了一种情况,如果我转到我 认为 ActiveResource 正在使用的 URL,它就可以正常工作。但是,当我实际使用 ActiveResource 时,它​​不起作用。看到它正在获取的 URL 将对此非常有帮助,所以...

有没有人知道记录(或以其他方式输出;如果有一些 resource.url 方法也可以很好地工作)ActiveResource 用来做它的事情的 URL?

【问题讨论】:

    标签: ruby-on-rails logging activeresource


    【解决方案1】:

    如果您将以下行添加到您的 environment.rb 文件中,它至少会记录请求,以便您知道 URL ActiveResource 正在命中:

    ActiveResource::Base.logger = ActiveRecord::Base.logger
    

    我仍在寻找更好的解决方案,以显示响应和发布到更新调用的数据,但至少这是朝着正确方向迈出的一步。我真的不知道为什么ActiveResource 有一个单独的记录器开始,但这是另一回事。

    【讨论】:

    • 如果您不使用 ActiveRecord,只需使用单独的记录器:active_resource_logger = Logger.new('log/active_resource.log', 'daily'); active_resource_logger.level = Rails.env.dev? ? Logger::DEBUG : Logger::INFO; ActiveResource::Base.logger = active_resource_logger
    • 我知道这已经很老了,但是 http_logger gem (github.com/railsware/http_logger) 非常适合这个。当您设置HttpLogger.log_request_body = true 时,您可以看到发送到 ActiveResource 站点的 HTTP 请求以及它可能向您吐出的任何错误
    • 如果您不使用 ActiveRecord,也可以使用 ActiveResource::Base.logger = Rails.logger
    【解决方案2】:

    我刚刚遇到了同样的问题,并在寻找答案时偶然发现了这篇文章。我确实发现,这被证明是有用的,是 ActiveResource::Base 上的 collection_path 方法。例如,假设您有以下资源:

    class UserPost < ActiveResource::Base
        self.site = "http://someApp.com/user/:user_id"
        self.element_name = "post"
    

    如果你去 rails 控制台,这里有一些输出示例:

    >> UserPost.collection_path
    "/user//post"
    >> UserPost.collection_path(:user_id => 5)
    "/user/5/post
    

    这应该为您提供确定 ActiveResource 如何将您的请求转换为 URL 所需的确切信息。

    【讨论】:

      【解决方案3】:

      要获取 ActiveResource 的详细登录信息,必须修补 gem 中的请求方法(method.

      将以下文件放入config/initializers,您将获得http方法、路径、请求正文、请求hedaers

      如果您需要,

      响应正文和标题已经存在。 doc

      config/initializers/activeresource_patch.rb

      module ActiveResource
        class Connection
          private
            def request(method, path, *arguments)
              result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
                payload[:method]      = method
                payload[:request_uri] = "#{site.scheme}://#{site.host}:#{site.port}#{path}"
                payload[:request_path] = path
                payload[:request_body] = arguments[0]
                payload[:request_headers] = arguments[1]
                payload[:result]      = http.send(method, path, *arguments)
              end
              handle_response(result)
            rescue Timeout::Error => e
              raise TimeoutError.new(e.message)
            rescue OpenSSL::SSL::SSLError => e
              raise SSLError.new(e.message)
            end
        end
      end
      

      config/initializers/activeresource_logger.rb

      Rails.application.configure do
      
        def activeresource_logger
        @activeresource_logger ||= Logger.new("#{Rails.root}/log/activeresource_logger.log")
        end
      
        ActiveSupport::Notifications.subscribe('request.active_resource')  do |name, start, finish, id, payload|
         if Rails.env.development?
          activeresource_logger.info("====================== #{start} : #{payload[:method].upcase} ======================")
          activeresource_logger.info("PATH: #{payload[:request_path]}")
          activeresource_logger.info("BODY: #{payload[:request_body]}")
          activeresource_logger.info("HEADERS: #{payload[:request_headers]}")
          # activeresource_logger.info("STATUS_CODE: #{payload[:result].code}")
          # activeresource_logger.info("RESPONSE_BODY: #{payload[:result].body}")
         end
        end
      
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-26
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多