Как просмотреть ответ HTTP на запрос ActiveResource?
-
03-07-2019 - |
Вопрос
Я пытаюсь отладить вызов ActiveResource, который не работает.
Как лучше всего просмотреть ответ HTTP на запрос, который делает ActiveResource?
Решение
Это просто.Просто посмотрите на ответ, который приходит.:)
Два варианта:
- У вас есть исходный файл на вашем компьютере.Отредактируйте это.Поставьте
puts response.inspect
в соответствующем месте.Не забудьте удалить его. - У Руби есть открытые занятия.Найдите правильный метод и переопределите его, чтобы он делал именно то, что вы хотите, или используйте для этого псевдонимы и цепочку вызовов.Вероятно, существует метод, который возвращает ответ — возьмите его, распечатайте и затем верните.
Вот глупый пример последнего варианта.
# 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
чтобы объединить вызовы псевдонимов.)
Другие советы
Обезьяна исправит соединение, чтобы включить режим отладки Net :: HTTP. Смотрите https://gist.github.com/591601 - я написал это, чтобы решить именно эту проблему. Добавление этого списка в ваше приложение rails даст вам Net :: HTTP.enable_debug!
и Net :: HTTP.disable_debug!
, которые можно использовать для печати отладочной информации. р>
Режим отладки Net :: HTTP небезопасен и не должен использоваться в рабочей среде, но чрезвычайно информативен для отладки.
Добавьте новый файл в config / initializer /
с именем '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.
Мне нравится Wireshark , потому что вы можете запустить его прослушивание на стороне клиента веб-браузера (обычно на вашем компьютере разработчика) ), а затем сделать запрос страницы. Затем вы можете найти HTTP-пакеты, щелкнуть правой кнопкой мыши и " Follow Conversation " чтобы увидеть 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 (т.е. не имеет состояния), вы получите тот же ответ, что и ARes.
Или, если я не знаю точных внутренних данных, мой метод состоит в том, чтобы буквально добавить «отладчик». оператор, запустите сервер, используя "скрипт / сервер --debugger" и затем пошагово просматривайте код, пока я не окажусь в нужном месте, затем начните проверку прямо в IRB ....., что может помочь (эй, Люк, кстати)
Возможно, лучший способ - использовать анализатор трафика.
(Что бы сработало ... за исключением того, что в моем случае трафик, который я хочу видеть, зашифрован. Да!)
Я бы использовал TCPFlow , чтобы наблюдать за трафиком, передаваемым по проводам, вместо того, чтобы исправлять мое приложение, чтобы вывести его.
плагин firefox для заголовков http в реальном времени ( http://livehttpheaders.mozdev.org/ ) великолепен за это. Или вы можете использовать инструмент для веб-сайтов, например http://www.httpviewer.net/