Domanda

Sto provando a eseguire il debug di una chiamata ActiveResource che non funziona.

Qual è il modo migliore per visualizzare la risposta HTTP alla richiesta che ActiveResource sta facendo?

È stato utile?

Soluzione

È facile. Guarda la risposta che ritorna. :)

Due opzioni:

  • Hai il file sorgente sul tuo computer. Modificalo. Inserisci un inserisce response.inspect nel punto appropriato. Ricordati di rimuoverlo.
  • Ruby ha classi aperte. Trova il metodo giusto e ridefiniscilo per fare esattamente quello che vuoi, oppure usa gli alias e chiama il concatenamento per farlo. Probabilmente esiste un metodo che restituisce la risposta: prendila, stampala e poi restituiscila.

Ecco un esempio sciocco di quest'ultima opzione.

# 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

Immagina che la definizione della prima classe sia nei file sorgente di ActiveRecord. La definizione di seconda classe è nella tua applicazione da qualche parte.

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

Puoi vedere che lo stampa e poi lo restituisce. Bene, eh?

(E sebbene il mio semplice esempio non lo usi poiché non utilizza Rails, controlla alias_method_chain per combinare le tue chiamate alias.)

Altri suggerimenti

Monkey patch la connessione per abilitare la modalità debug Net :: HTTP. Vedi https://gist.github.com/591601 - L'ho scritto per risolvere esattamente questo problema. L'aggiunta di questa sintesi alla tua app rails ti darà Net :: HTTP.enable_debug! e Net :: HTTP.disable_debug! che puoi usare per stampare le informazioni di debug.

Net :: La modalità di debug HTTP non è sicura e non dovrebbe essere utilizzata in produzione, ma è estremamente istruttiva per il debug.

Aggiungi un nuovo file a config / initializer / chiamato 'debug_connection.rb' con il seguente contenuto:

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

Questo stamperà l'intero traffico di rete su $ stderr.

Mi piace Wireshark perché puoi avviarlo ascoltando dall'estremità del client del browser web (di solito la tua macchina di sviluppo ) e quindi fare una richiesta di pagina. Quindi puoi trovare i pacchetti HTTP, fare clic con il tasto destro e " Segui conversazione " per vedere l'HTTP con le intestazioni che vanno avanti e indietro.

Funziona solo se controlli anche il server:

Segui il registro del server e pesca l'URL chiamato:

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]

e quindi aprilo in Firefox. Se il server è veramente RESTful (cioè senza stato) otterrai la stessa risposta di ARes.

O il mio metodo per entrare in cose quando non conosco gli interni esatti è letteralmente solo per lanciare un "debugger" , avvia il server usando " script / server --debugger " e poi passo attraverso il codice fino a quando non sono nel posto che voglio, quindi inizia un po 'di ispezione proprio lì in IRB ..... che potrebbe aiutare (hey Luke btw)

Forse il modo migliore è usare uno sniffer di traffico.

(Che funzionerebbe totalmente ... tranne nel mio caso il traffico che voglio vedere è crittografato. D'oh!)

Vorrei usare TCPFlow qui per guardare il traffico che passa sul cavo, piuttosto che patchare la mia app per produrla.

le intestazioni http live del plug-in firefox ( http://livehttpheaders.mozdev.org/ ) è fantastico per questo. Oppure puoi utilizzare uno strumento per siti Web come http://www.httpviewer.net/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top