ruby on rails-如何查看对ActiveResource请求的HTTP响应



我正在尝试调试一个不起作用的ActiveResource调用。

查看ActiveResource对请求的HTTP响应的最佳方式是什么?

Monkey修补连接以启用Net::HTTP调试模式。看见https://gist.github.com/591601-我写这本书正是为了解决这个问题。将此要点添加到rails应用程序中将为您提供Net::HTTP.enable_debug!Net::HTTP.disable_debug!,您可以使用它们来打印调试信息。

Net::HTTP调试模式是不安全的,不应该在生产中使用,但对于调试来说信息非常丰富。

config/initializers/添加一个名为'debug_connection.rb'的新文件,其中包含以下内容:

class ActiveResource::Connection
  # Creates new Net::HTTP instance for communication with
  # remote service and resources.
  def http
    http = Net::HTTP.new(@site.host, @site.port)
    http.use_ssl = @site.is_a?(URI::HTTPS)
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl
    http.read_timeout = @timeout if @timeout
    # Here's the addition that allows you to see the output
    http.set_debug_output $stderr
    return http
  end
end

这将把整个网络流量打印到$stderr。

这很容易。看看回复就知道了。:)

两种选择:

  • 您的计算机上有源文件。编辑它。在适当的地方放一个puts response.inspect。记得把它取下来
  • Ruby有开放类。找到合适的方法并重新定义它,使其完全符合您的要求,或者使用别名和调用链接来实现这一点。可能有一个方法可以返回响应——抓取它,打印它,然后返回它

下面是后一种选择的一个愚蠢的例子。

# Somewhere buried in ActiveResource:
class Network
  def get
    return get_request
  end
  def get_request
    "I'm a request!"
  end
end
# Somewhere in your source files:
class Network
  def print_request
    request = old_get_request
    puts request
    request
  end
  alias :old_get_request :get_request
  alias :get_request :print_request
end

假设第一个类定义在ActiveRecord源文件中。第二个类定义在应用程序中的某个位置。

$ irb -r openclasses.rb 
>> Network.new.get
I'm a request!
=> "I'm a request!"

你可以看到它打印出来然后返回。整洁,是吗?

(尽管我的简单示例没有使用它,因为它没有使用Rails,但请查看alias_method_chain来组合您的别名调用。)

我喜欢Wireshark,因为你可以在web浏览器客户端(通常是你的开发机器)上开始监听,然后进行页面请求。然后,您可以找到HTTP数据包,右键单击并"关注对话"以查看具有来回标头的HTTP。

只有当您还控制服务器时,这才有效:

按照服务器日志,找出被调用的URL:

Completed in 0.26889 (3 reqs/sec) | Rendering: 0.00036 (0%) | DB: 0.02424 (9%) | 200 OK [http://localhost/notifications/summary.xml?person_id=25738]

然后在Firefox中打开它。如果服务器是真正的RESTful(即无状态),您将得到与AR相同的响应。

或者,当我不知道确切的内部结构时,我的方法就是输入一个"debugger"语句,使用"script/server--debugger"启动服务器,然后逐步执行代码,直到到达我想要的位置,然后在IRB中开始一些检查。。。。。这可能会有所帮助(嘿Luke btw)

也许最好的方法是使用流量嗅探器。

(这完全可行……除了在我的情况下,我想看到的流量是加密的。哦!)

我会在这里使用TCPFlow来观察网络上的流量,而不是修补我的应用程序来输出它。

firefox插件实时http头(http://livehttpheaders.mozdev.org/)非常适合这个。或者你可以使用网站工具http://www.httpviewer.net/

最新更新