Come posso visualizzare le richieste di rete (per il debug) in React Native?


102

Vorrei visualizzare le mie richieste di rete in React Native per aiutarmi a eseguire il debug, idealmente nella scheda "Rete" degli strumenti di sviluppo di Chrome.

Ci sono alcuni problemi chiusi al riguardo su GitHub ( https://github.com/facebook/react-native/issues/4122 e https://github.com/facebook/react-native/issues/934 ) ma non lo faccio t capirli completamente. Sembra che sia necessario 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 questo che potrebbero renderlo un'idea terribile, ma nessuno coinvolto nel thread ha dichiarato esplicitamente cosa siano.

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

Risposte:


91

Questo è ciò che ho utilizzato nel punto di ingresso della mia app

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

XMLHttpRequest = _XHR

EDIT: frevib collegato a una sintassi più concisa di seguito. Grazie frevib!

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

Spiegazione:

GLOBAL.originalXMLHttpRequestfa riferimento alla copia di Chrome Dev Tools di XHR. È fornito da RN come portello di fuga. La soluzione di Shvetusya funzionerà solo se gli strumenti di sviluppo sono aperti e quindi forniscono XMLHttpRequest.

EDIT: dovrai consentire le richieste cross origin quando sei in modalità debugger. Con Chrome puoi usare questo pratico plugin .

EDIT: Leggi il problema di GitHub RN che mi ha portato a questa soluzione


4
Dopo aver inserito quel pezzo di codice, sono in grado di vedere la richiesta nella Console per gli sviluppatori ma tutte le mie richieste falliscono con uno stato 404. Qualcuno ha idea del perché potrebbe accadere?
Peter_Fretter

1
Funziona. Ho preso questo da Github
frevib

1
Questo non funziona per me. Uso l'emulatore Android e la scheda Rete mostra che vengono inviate richieste pari vuote
Ville Miekk-oja

19
Questo non funziona più, nella console viene visualizzato il seguente errore (non sono sicuro di quale cambiamento abbia causato questo):Uncaught Error: unsupported BodyInit type at Response.Body._initBody (fetch.js:231) at new Response (fetch.js:390) at XMLHttpRequest.xhr.onload (fetch.js:437)
Maxim Zubarev

1
Funziona dalla mia parte su React Native Debugger con questa configurazione one-liner. Grazie un milione di volte, @tryangul
Kaloyan Kosev

88

Non sono sicuro del motivo per cui nessuno ha indicato questa soluzione finora. Usa React Native Debugger - https://github.com/jhen0409/react-native-debugger ! È il miglior strumento di debug per React Native secondo me e offre Network Inspection fuori dagli schemi.

Dai un'occhiata a questi screenshot.

Fare clic con il tasto destro e selezionare "Abilita Network Inspect" Abilitazione di Network Inspect

Fare clic con il tasto destro e selezionare "Abilita Network Inspect" Abilitazione di Network Inspect

Esegui il debug! Network Inspect in azione


10
Se stai sfogliando e vedi questa risposta, tieni presente che DEVI fare clic con il pulsante destro del mouse e Enable Network Inspectaffinché funzioni. Per impostazione predefinita, non lo fa.
Stephen Saucier

1
Funziona benissimo! Renderà la mia vita molto più facile.
Augusto Samamé Barrientos

1
Wow, perché questa funzione è nascosta da un clic destro sul pannello principale. Non ho mai saputo che esistesse. Cambio di gioco. Le risposte di Json non venivano visualizzate ... apparivano subito su toggle. Grazie!
Matt

2
Perché questo non è più noto? 🤷‍♂️
Tom Mulkins,

1
Più come perché non è questo il comportamento predefinito ogni volta che visitiamo la scheda Rete o contrassegniamo come un'impostazione (casella di controllo o alcuni tipi) all'interno di quella scheda!
CyberMew

46

Uso quanto segue nella mia app (aggiungilo nel file del 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 recupero nella console che sono ben formattati.

Immagine dello schermo:

inserisci qui la descrizione dell'immagine

Nella scheda Rete:

inserisci qui la descrizione dell'immagine


È fantastico! Grazie
DJ Forth

A che punto della richiesta originale viene attivato? In realtà sto pensando di utilizzare questo come meccanismo per attivare i token di aggiornamento se una risposta ha un 401. C'è un problema con questo?
tushar747

FANTASTICO Sankalp! Ho avuto problemi a far funzionare Reacotron senza arrestare il mio generatore Metro. La tua soluzione funziona alla grande. Funziona anche in React Native Debugger.
mediaguru

Il valore dell'intestazione "Access-Control-Allow-Origin" nella risposta non deve essere il carattere jolly "*" quando la modalità delle credenziali della richiesta è "include". L'accesso all'origine " localhost: 8081 " non è pertanto consentito. La modalità delle credenziali delle richieste avviate da XMLHttpRequest è controllata dall'attributo withCredentials.
Nikhil Mahirrao

Eccezionale. Grazie mille
Mark

27

Uso Reactotron per monitorare la richiesta di rete.

inserisci qui la descrizione dell'immagine


3
questa è in realtà la migliore soluzione tra tutte le risposte qui (per me) .. super facile da configurare e non ha tutti gli effetti collaterali dell'utilizzo di chrome
Blue Bot

Quali sono gli effetti collaterali dell'utilizzo di Chrome di cui sei preoccupato? Reactotron utilizza Chromium Embedded Framework.
Peter Evan Deal

eccezionale !! grazie mi hai risparmiato giorni di ricerche in rete
Alain

12

So che questa è una vecchia domanda, ma c'è un modo molto più sicuro per farlo ora che non richiede la disabilitazione di CORS o la modifica del codice sorgente React Native. Puoi utilizzare una libreria di terze parti chiamata Reactotron che non solo tiene traccia delle chiamate API (utilizzando il plug-in di rete), ma può anche monitorare il tuo negozio Redux e Sagas con configurazione aggiuntiva:

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


Reactotron sembrava funzionare solo se utilizzavi una libreria esterna chiamata apisauce. Non funziona per il normale recupero. Quindi, se vuoi monitorare le richieste inviate da librerie esterne nella tua app, Reactotron non va bene.
Ville Miekk-oja,

1
@ VilleMiekk-oja, infatti, reactotron supporta Networking with Fetch da marzo, è solo che la documentazione era obsoleta. L'ho provato da solo e l'ho corretto nel file readme :)
Juan Carlos Alpizar Chinchilla

funziona in modo eccellente; Ho riscontrato così tanti problemi con: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad

1
Reactotron è davvero facile da configurare e utile per tenere traccia delle chiamate di rete delle applicazioni native di React
Ram

9

Sono stato in grado di eseguire il debug delle mie richieste in Chrome eliminando il polyfill fornito da React Native dopo l'importazione di React Native.

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

Questo ha funzionato per me per le stesse richieste di origine. Non sono sicuro se è necessario disabilitare CORS in Chrome per farlo funzionare per cross origin.


Che cos'è una richiesta "della stessa origine", nel contesto delle richieste effettuate da un'app React Native? Uno che si trova nello stesso dominio del debugger (cioè probabilmente localhost)?
Mark Amery

per il mio caso devi disabilitare CORS in Chrome per farlo funzionare per cross origin. controlla questo plug-in di Chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul

@MouhamedHalloul puoi spiegare come hai utilizzato questo plugin?
alexmngn

@alexmngn ehi, basta installare il plugin e accenderlo facendo scorrere il pulsante, l'icona dovrebbe essere verde quando è acceso e rossa quando è spento. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul

5

In passato ho utilizzato l' GLOBAL.XMLHttpRequesthack per tenere traccia delle mie richieste API, ma a volte è molto lento e non ha funzionato per le richieste di risorse. Ho deciso di utilizzare la Postman’s proxyfunzionalità per ispezionare la comunicazione HTTP in uscita dal telefono. Per i dettagli guarda la documentazione ufficiale , ma fondamentalmente ci sono tre semplici passaggi:

  • Configura il proxy in Postman
  • Controlla l'indirizzo IP del tuo computer ( $ ifconfig)
  • Configura il proxy HTTP sul tuo dispositivo mobile nelle impostazioni Wi-Fi

5

Fai attenzione a questo codice.

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

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

Usalo per chiamate regolari non ma per chiamate multipart / form-data


2

Suggerisco di usare Charles per esaminare le tue richieste di rete. È davvero buono e offre maggiore visibilità e ti consente 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 fare per catturare TUTTE le richieste? (Sto colpendo
un'API

La tua API esterna utilizza HTTPS? In tal caso, è necessario configurare un po 'Charles per catturare anche quelli.
Ran Yefet

quando si utilizza Android, charles può essere un po 'problematico per acquisire le richieste in uscita. devi configurare 'manualmente' il tuo simulatore per accedere a charles (e l'ultima volta che ho provato, andare nel pannello di configurazione non avrebbe funzionato - l'ip proxy doveva essere passato da un'istanza della riga di comando).
joe

1

Se stai cercando di eseguire il debug delle richieste di rete su una versione di rilascio della tua app, puoi utilizzare la libreria react-native-network-logger . Ti consente di monitorare e visualizzare le richieste di rete all'interno dell'app da una schermata di debug personalizzata.

elenco di logger di rete-nativo di reazione

dettagli del logger di rete-nativo di reazione

Puoi quindi metterlo dietro un flag di build o un flag di rete per disabilitarlo per gli utenti nell'app di produzione.

Basta installarlo con yarn add react-native-network-loggerquindi aggiungerlo al punto di ingresso della tua app:

import { startNetworkLogging } from 'react-native-network-logger';

startNetworkLogging();
AppRegistry.registerComponent('App', () => App);

E questo in una schermata di debug:

import NetworkLogger from 'react-native-network-logger';

const MyScreen = () => <NetworkLogger />;

Disclaimer: sono l'autore del pacchetto.


Amico, questa libreria è fantastica! Grazie
Emidomenge

0

Se hai un telefono Android o un emulatore,

  • npx react-native start

Quindi apri Android Studio .

Apri la androidcartella del tuo progetto come progetto Android Studio.

inserisci qui la descrizione dell'immagine

Fare clic sull'icona blu che è Android Profiler

Dopo l'avvio di Android Profiler, puoi aggiungere la tua app tramite l'icona grigia più vicino SESSIONSall'etichetta inserisci qui la descrizione dell'immagine

Ora puoi ispezionare la rete tramite questo strumento. Puoi vedere triangoli che mostrano la tua attività di rete.

Controlla questo per maggiori informazioni sull'ispezione del traffico di rete .


-25

Aggiungi Debugger in js dove puoi vedere la richiesta o la risposta

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.