代码之家  ›  专栏  ›  技术社区  ›  machineghost

如何记录ActiveResource使用的URL?

  •  22
  • machineghost  · 技术社区  · 14 年前

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

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

    我希望ActiveResource会打电话给:

    myIssues.com/issues.xml?page=2
    

    …但我不知道。据我所知,ActiveResource可能认为它不喜欢“page”这个词,因此它实际上使用:

    myIssues.com/issues.xml?mod_page=2
    

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

    是否有人知道记录(或以其他方式输出;如果有一些resource.url方法也可以很好地工作)ActiveResource用于执行其操作的url的方法?

    3 回复  |  直到 6 年前
        1
  •  24
  •   sbonami Jeff Whitmire    11 年前

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

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

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

        2
  •  7
  •   zwickilton    13 年前

    我刚刚遇到了同样的问题,在寻找答案的时候遇到了这篇文章。我发现的是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
  •  2
  •   Alupotha    6 年前

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

    将下面的文件放入 config/initializers You will get http method,path,request body,request hedares

    Response Body and Header is already there if you needed. doc

    配置/初始值设定项/ActiveResource_patch.rb

    模块激活源 类连接 私有的 def请求(方法、路径、*参数) 结果=activesupport::notifications.instrument(“request.active_resource”)do有效负载| 有效载荷[:方法]=方法 payload[:request_uri]=“site.scheme:/site.host:site.port path” 有效负载[:请求路径]=路径 有效负载[:请求主体]=参数[0] 有效载荷[:请求头]=参数[1] 有效负载[:result]=http.send(方法、路径、*参数) 结束 处理响应(结果) 救援超时::错误=>e 提高TimeoutError.New(e.message) rescue openssl::ssl::sslerror=>e 引发sslerror.new(e.message) 结束 结束 结束 < /代码>

    config/initializers/activeresource_logger.rb

    rails.application.configure do
    
    def activeresource_记录器
    @activeResource_logger=logger.new(“35; rails.root/log/activeResource_logger.log”)。
    结束
    
    activesupport::notifications.subscribe('request.active_resource')do name,start,finish,id,payload|
    如果是rails.env.development?
    activeResource_logger.info(“================start:payload[:method].upcase===========”)
    activeResource_logger.info(“路径:35;有效负载[:请求路径]”)。
    activeResource_logger.info(“body:payload[:request_body]”)。
    activeResource_logger.info(“headers:payload[:request_headers]”)。
    #activeResource_logger.info(“状态_代码:有效负载[:结果]。代码”)
    #activeResource_logger.info(“response_body:payload[:result].body”)。
    结束
    结束
    
    结束
    < /代码> 
    

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

    将以下文件放入config/initializers你会得到HTTP方法、路径、请求主体、请求海德尔

    响应主体和标题如果你需要的话已经在那里了。doc

    配置/初始值设定项/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