Question

J'essaie de déboguer un appel ActiveResource qui ne fonctionne pas.

Quel est le meilleur moyen d'afficher la réponse HTTP à la requête émise par ActiveResource?

Était-ce utile?

La solution

C'est facile. Il suffit de regarder la réponse qui revient. :)

Deux options:

  • Vous avez le fichier source sur votre ordinateur. Éditer. Placez un place answer.inspect à l'endroit approprié. N'oubliez pas de l'enlever.
  • Ruby a des classes ouvertes. Trouvez la bonne méthode et redéfinissez-la pour faire exactement ce que vous voulez, ou utilisez des alias et un chaînage d'appels pour le faire. Il existe probablement une méthode qui renvoie la réponse: saisissez-la, imprimez-la, puis renvoyez-la.

Voici un exemple stupide de cette dernière option.

# 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

Imaginez que la première définition de classe se trouve dans les fichiers source ActiveRecord. La deuxième définition de classe figure quelque part dans votre application.

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

Vous pouvez voir qu’il l’imprime puis le renvoie. Neat, hein?

(Et bien que mon exemple simple ne l'utilise pas puisqu'il n'utilise pas Rails, consultez alias_method_chain pour combiner vos appels d'alias.)

Autres conseils

Monkey corrige la connexion pour activer le mode de débogage Net :: HTTP. Voir https://gist.github.com/591601 - Je l'ai écrit pour résoudre précisément ce problème. En ajoutant cet élément essentiel à votre application rails, vous obtiendrez Net :: HTTP.enable_debug! et Net :: HTTP.disable_debug! que vous pouvez utiliser pour imprimer les informations de débogage.

Le mode de débogage Net :: HTTP n'est pas sécurisé et ne devrait pas être utilisé en production, mais il est extrêmement instructif pour le débogage.

Ajouter un nouveau fichier à config / initializers / appelé 'debug_connection.rb' avec le contenu suivant:

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

Ceci imprimera tout le trafic réseau sur $ stderr.

J'aime Wireshark , car vous pouvez commencer à l'écouter du côté du client du navigateur Web (généralement votre ordinateur de développement). ) et ensuite faire une demande de page. Ensuite, vous pouvez trouver les paquets HTTP, cliquer avec le bouton droit de la souris et "Suivre la conversation". pour voir le HTTP avec les en-têtes qui vont et viennent.

Ceci ne fonctionne que si vous contrôlez également le serveur:

Suivez le journal du serveur et identifiez l'URL appelée:

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]

puis ouvrez-le dans Firefox. Si le serveur est vraiment RESTful (c’est-à-dire sans état), vous obtiendrez la même réponse que celle fournie par ARes.

Ou ma méthode pour entrer dans les choses lorsque je ne connais pas les composants internes exacts consiste littéralement à ajouter un "débogueur". déclaration, démarrez le serveur à l’aide de " script / server --debugger " et ensuite, parcourez le code jusqu’à ce que je sois à l’endroit que je veux, puis commencez à inspecter dans IRB ..... cela pourrait aider (hé Luke btw)

Le meilleur moyen est peut-être d'utiliser un renifleur de trafic.

(Ce qui fonctionnerait totalement ... sauf dans mon cas, le trafic que je veux voir est crypté. D'oh!)

Je voudrais utiliser TCPFlow pour surveiller le trafic sur le réseau, plutôt que de patcher mon application pour la sortir.

les en-têtes http live du plugin firefox ( http://livehttpheaders.mozdev.org/ ) sont excellents pour ça. Vous pouvez également utiliser un outil de site Web tel que http://www.httpviewer.net/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top