2015-11-30 9 views
29

Vorrei visualizzare le richieste di rete in React Native per aiutarmi a eseguire il debug, idealmente nella scheda "Rete" degli sviluppatori di Chrome.Come posso visualizzare le richieste di rete (per il debug) in React Native?

Ci sono alcuni problemi su questo argomento su GitHub (https://github.com/facebook/react-native/issues/4122 e https://github.com/facebook/react-native/issues/934) ma non li capisco completamente. Sembra che ho bisogno di annullare alcuni dei polyfill di React Native e quindi eseguire alcuni comandi con flag di debug aggiuntivi e magari modificare alcune impostazioni di sicurezza di Chrome? E a quanto pare ci sono alcuni problemi di sicurezza coinvolti nel fare ciò che potrebbe renderlo una pessima idea, ma nessuno coinvolto nel thread ha dichiarato esplicitamente quello che sono.

Qualcuno potrebbe fornire una guida dettagliata per far funzionare la scheda Rete con React Native, oltre a una spiegazione dei problemi di sicurezza coinvolti nel fare ciò?

risposta

-10

Add Debugger nei js, dove si può vedere il req o la risposta

4

sono stato in grado di eseguire il debug le mie richieste in Chrome cancellando polyfill che reagiscono Native fornisce dopo l'importazione React nativo.

var React = require('react-native'); 
delete GLOBAL.XMLHttpRequest; 

Questo ha funzionato per me per le stesse richieste di origine. Non sei sicuro di dover disattivare CORS in Chrome per farlo funzionare per l'origine incrociata.

+0

Che una richiesta "stessa origine", nel contesto delle richieste fatte da un Reagire app nativa? Uno che si trova nello stesso dominio del debugger (ad esempio, probabilmente localhost)? –

+0

per il mio caso è necessario disabilitare CORS in Chrome per farlo funzionare per l'origine incrociata. controlla questo plugin per Chrome: https: //chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi? hl = fr –

+0

@MouhamedHalloul puoi spiegare come hai usato questo plugin? – alexmngn

1

Suggerisco di utilizzare Charles per ispezionare le richieste di rete. È davvero buono e offre più visibilità e ti permette di fare cose avanzate.

http://charlesproxy.com

+1

Ho appena provato Charles e sembra catturare solo 'http: // localhost: 8081 /index.android.bundle? platform = android & dev = true' .. come si fa a catturare TUTTE le richieste? (Sto colpendo una api esterna) – jakeed1

+0

La tua API esterna utilizza HTTPS? Se è così, è necessario configurare Charles un po 'per catturare anche quelli. –

43

Questo è quello che ho usato nel punto di ingresso del mio app

const _XHR = GLOBAL.originalXMLHttpRequest ? 
    GLOBAL.originalXMLHttpRequest :   
    GLOBAL.XMLHttpRequest      

XMLHttpRequest = _XHR 

EDIT: frevib legata alla sintassi più concisa sotto. Grazie a frevib!

GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest; 

Spiegazione:

GLOBAL.originalXMLHttpRequest riferisce i gli strumenti di Chrome Dev copia di XHR. È fornito da RN come un portello di emergenza. La soluzione di Shvetusya funzionerà solo se gli strumenti di sviluppo sono aperti e fornendo così XMLHttpRequest.

MODIFICA: è necessario consentire le richieste di origine incrociata in modalità debugger. Con chrome puoi usare this handy plugin.

EDIT: Read about the RN github issue che mi portano a questa soluzione

+1

Dopo aver inserito quella parte di codice, sono in grado di vedere la richiesta nella Developer Console ma tutte le mie richieste falliscono con uno stato 404. Qualcuno ha qualche idea del perché possa accadere? –

+0

XMLHttpRequest non è definito :( –

+1

Questo funziona. Ha preso questo da [Github] (https://github.com/facebook/react-native/issues/934#issuecomment-269811544) – frevib

10

Io uso il seguente nella mia app (Aggiungere questo nel vostro file di punto di ingresso app.js principale):

// To see all the requests in the chrome Dev tools in the network tab. 
XMLHttpRequest = GLOBAL.originalXMLHttpRequest ? 
    GLOBAL.originalXMLHttpRequest : 
    GLOBAL.XMLHttpRequest; 

    // fetch logger 
global._fetch = fetch; 
global.fetch = function (uri, options, ...args) { 
    return global._fetch(uri, options, ...args).then((response) => { 
    console.log('Fetch', { request: { uri, options, ...args }, response }); 
    return response; 
    }); 
}; 

La cosa migliore è che mostra anche i log di fetch nella console che sono ben formattati.

Screenshot:

enter image description here

Sulla scheda di rete:

enter image description here

+0

React-Native ha confermato di funzionare! Grazie – PubNub

5

So che questa è una vecchia questione, ma c'è un modo molto più sicuro per fare questo, ora che non lo fa richiede la disabilitazione di CORS o la modifica del codice sorgente React Native. È possibile utilizzare una libreria di terze parti chiamato Reactotron che le tracce non solo le chiamate alle API (utilizzando il plugin di rete), ma anche possibile monitorare il vostro negozio Redux, e Sagas con configurazione aggiuntiva:

https://github.com/infinitered/reactotron https://github.com/infinitered/reactotron/blob/master/docs/plugin-networking.md

+0

Reactotron sembrava funzionare solo se si utilizzava la libreria esterna chiamata apisauce.Non funziona per il recupero normale. Quindi, se vuoi monitorare le richieste inviate da librerie esterne nella tua app, reactron non va bene. –

+0

@ VilleMiekk-oja infatti reactotron supporta Networking with Fetch da marzo, è solo la documentazione obsoleta. L'ho provato io stesso e corretto sul readme :) –

0

In passato Ho usato GLOBAL.XMLHttpRequest hack per tracciare le mie richieste API ma a volte è molto lento e non ha funzionato per le richieste di risorse. Ho deciso di utilizzare la funzione Postman’s proxy per ispezionare la comunicazione HTTP che esce dal telefono. Per i dettagli guarda il official documentation, ma in fondo, ci sono tre semplici passaggi:

  • Impostare il proxy in Postman
  • Controllare l'indirizzo IP del computer ($ ifconfig)
  • procura
  • Configura HTTP sul tuo dispositivo mobile in impostazioni wifi
0

Si prega di fare attenzione con questo codice.

XMLHttpRequest = GLOBAL.originalXMLHttpRequest ? 
    GLOBAL.originalXMLHttpRequest : GLOBAL.XMLHttpRequest; 

Aiuta ed è ottimo ma distrugge il caricamento. Trascorro 2 giorni cercando di capire perché i file caricati stanno inviando [oggetto oggetto] invece del file reale. Il motivo è un codice sopra.

utilizzarlo per effettuare chiamate regolari non ma per multipart/form-data chiamate