7

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

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

4

9 回答 9

14

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

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

于 2011-08-24T12:30:03.043 回答
4

添加一个新文件来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。

于 2011-11-07T18:25:43.070 回答
3

我喜欢Wireshark,因为您可以在 Web 浏览器客户端(通常是您的开发机器)上启动它,然后执行页面请求。然后你可以找到HTTP数据包,右键点击“Follow Conversation”可以看到HTTP头来回移动。

于 2008-10-23T02:58:41.563 回答
3

这简单。只需查看返回的响应即可。:)

两种选择:

  • 您的计算机上有源文件。编辑它。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以组合您的别名调用。)

于 2008-10-25T13:09:11.073 回答
1

这仅在您还控制服务器时才有效:

按照服务器日志,找出被调用的 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(即无状态),您将获得与 ARes 相同的响应。

于 2008-10-26T09:20:24.140 回答
0

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

(这完全可以工作......除了在我的情况下,我想看到的流量是加密的。D'oh!)

于 2008-10-22T23:31:21.093 回答
0

或者当我不知道确切的内部结构时,我进入事物的方法实际上只是抛出一个“调试器”语句,使用“脚本/服务器 --debugger”启动服务器,然后逐步执行代码直到我'我在我想要的地方,然后在 IRB 那里开始一些检​​查.....这可能会有所帮助(嘿卢克顺便说一句)

于 2008-10-23T02:06:04.587 回答
0

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

于 2014-09-26T09:17:20.733 回答
-1

firefox 插件 live http headers ( http://livehttpheaders.mozdev.org/ ) 非常适合这个。或者您可以使用http://www.httpviewer.net/之类的网站工具

于 2009-01-25T17:40:44.410 回答