Pregunta

Estoy intentando depurar una llamada de ActiveResource que no funciona.

¿Cuál es la mejor manera de ver la respuesta HTTP a la solicitud que realiza ActiveResource?

¿Fue útil?

Solución

Es fácil. Solo mira la respuesta que regresa. :)

Dos opciones:

  • Tienes el archivo fuente en tu computadora. Editarlo. Coloque un pone response.inspect en el lugar apropiado. Recuerde eliminarlo.
  • Ruby tiene clases abiertas. Encuentre el método correcto y vuelva a definirlo para hacer exactamente lo que quiere, o use alias y llame al encadenamiento para hacer esto. Probablemente haya un método que devuelva la respuesta: cójalo, imprímalo y luego devuélvalo.

Aquí hay un ejemplo tonto de la última opción.

# 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

Imagine que la definición de primera clase está en los archivos de origen de ActiveRecord. La definición de segunda clase está en tu aplicación en algún lugar.

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

Puedes ver que lo imprime y luego lo devuelve. Limpio, ¿eh?

(Y aunque mi ejemplo simple no lo usa, ya que no está usando Rails, revisa alias_method_chain para combinar tus llamadas de alias).

Otros consejos

Monkey parchea la conexión para habilitar el modo de depuración Net :: HTTP. Consulte https://gist.github.com/591601 : lo escribí para solucionar precisamente este problema. Agregar esta información a su aplicación de rieles le dará Net :: HTTP.enable_debug! y Net :: HTTP.disable_debug! que puede usar para imprimir información de depuración.

El modo de depuración Net :: HTTP es inseguro y no debe utilizarse en producción, pero es extremadamente informativo para la depuración.

Agregue un nuevo archivo a config / initializers / llamado 'debug_connection.rb' con el siguiente contenido:

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

Esto imprimirá todo el tráfico de la red a $ stderr.

Me gusta Wireshark porque puede comenzar a escucharlo en el navegador web del cliente (generalmente su máquina de desarrollo ) y luego hacer una solicitud de página. Luego puede encontrar los paquetes HTTP, haga clic con el botón derecho y " Seguir conversación " para ver el HTTP con encabezados que van y vienen.

Esto solo funciona si también controlas el servidor:

Siga el registro del servidor y saque la URL que se llamó:

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]

y luego abrirlo en Firefox. Si el servidor es realmente RESTful (es decir, sin estado), obtendrá la misma respuesta que ARes.

O mi método para meterme en cosas cuando no conozco las partes internas exactas es, literalmente, lanzar un " depurador " Para iniciar el servidor, utilice " script / server --debugger " y luego paso a través del código hasta que esté en el lugar que quiero, luego comience a inspeccionar allí mismo en el IRB ... eso podría ayudar (hey Luke btw)

Quizás la mejor manera es usar un rastreador de tráfico.

(Lo que funcionaría totalmente ... excepto en mi caso, el tráfico que quiero ver está cifrado. D'oh!)

Utilizaría TCPFlow aquí para ver el tráfico que pasa por el cable, en lugar de parchear mi aplicación para generarla.

los encabezados http en vivo de Firefox plugin ( http://livehttpheaders.mozdev.org/ ) es genial para esto. O puede usar una herramienta de sitio web como http://www.httpviewer.net/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top