Как просмотреть ответ HTTP на запрос ActiveResource? - PullRequest
7 голосов
/ 23 октября 2008

Я пытаюсь отладить вызов ActiveResource, который не работает.

Какой лучший способ просмотреть ответ HTTP на запрос ActiveResource?

Ответы [ 9 ]

14 голосов
/ 24 августа 2011

Обезьяна исправит соединение, чтобы включить режим отладки Net :: HTTP. См. https://gist.github.com/591601 - я написал это, чтобы решить именно эту проблему. Добавление этого списка в ваше приложение rails даст вам Net::HTTP.enable_debug! и Net::HTTP.disable_debug!, которые вы можете использовать для печати отладочной информации.

Режим отладки Net :: HTTP небезопасен и не должен использоваться в рабочей среде, но чрезвычайно информативен для отладки.

4 голосов
/ 07 ноября 2011

Добавить в 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.

3 голосов
/ 25 октября 2008

Это легко. Просто посмотрите на ответ, который возвращается. :)

Два варианта:

  • У вас есть исходный файл на вашем компьютере. Отредактируйте это. Положите 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 для объединения ваших вызовов псевдонимов.)

3 голосов
/ 23 октября 2008

Мне нравится Wireshark , потому что вы можете запустить его прослушиванием на стороне клиента веб-браузера (обычно на компьютере разработчика) и затем выполнить запрос страницы. Затем вы можете найти HTTP-пакеты, щелкнуть правой кнопкой мыши и «Follow Conversation», чтобы увидеть HTTP с заголовками, идущими туда-сюда.

1 голос
/ 26 октября 2008

Это работает, только если вы также управляете сервером:

Следуйте журналу сервера и найдите 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.

0 голосов
/ 26 сентября 2014

Я бы использовал TCPFlow , чтобы наблюдать за трафиком, передаваемым по проводам, а не исправлять мое приложение для его вывода.

0 голосов
/ 25 января 2009

Плагин Firefox HTTP заголовки в реальном времени (http://livehttpheaders.mozdev.org/) отлично подходит для этого. Или вы можете использовать веб-инструмент, такой как http://www.httpviewer.net/

0 голосов
/ 23 октября 2008

Или, если я не знаю точных внутренних данных, мой метод состоит в том, чтобы буквально добавить оператор «отладчик», запустить сервер с помощью «script / server --debugger», а затем пошагово выполнить код пока я не окажусь в том месте, где хочу, затем начните проверку прямо в IRB ..... это может помочь (эй, Люк, кстати)

0 голосов
/ 23 октября 2008

Возможно, лучший способ - использовать анализатор трафика.

(что вполне сработало бы ... за исключением того, что в моем случае трафик, который я хочу видеть, зашифрован. Да!)

...