¿Cómo puedo ver las solicitudes de red (para depurar) en React Native?

102

Me gustaría ver mis solicitudes de red en React Native para ayudarme a depurar, idealmente en la pestaña 'Red' de las herramientas de desarrollo de Chrome.

Hay algunos problemas cerrados sobre esto en GitHub ( https://github.com/facebook/react-native/issues/4122 y https://github.com/facebook/react-native/issues/934 ) pero yo no ' Los entiendo completamente. Parece que necesito deshacer algunos de los polyfills de React Native y luego ejecutar algunos comandos con indicadores de depuración adicionales, y tal vez modificar algunas configuraciones de seguridad de Chrome. Y aparentemente hay algunos problemas de seguridad involucrados en hacer esto que podrían convertirlo en una idea terrible, pero nadie involucrado en el hilo ha declarado explícitamente cuáles son.

¿Alguien podría proporcionar una guía paso a paso para hacer que la pestaña Red funcione con React Native, así como una explicación de los problemas de seguridad involucrados al hacerlo?

Mark Amery
fuente

Respuestas:

91

Esto es lo que he estado usando en el punto de entrada de mi aplicación.

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

XMLHttpRequest = _XHR

EDITAR: frevib vinculado a una sintaxis más concisa a continuación. ¡Gracias frevib!

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

Explicación:

GLOBAL.originalXMLHttpRequesthace referencia a la copia de Chrome Dev Tools de XHR. Es proporcionado por RN como una trampilla de escape. La solución de Shvetusya solo funcionará si las herramientas de desarrollo están abiertas y, por lo tanto, proporcionan XMLHttpRequest.

EDITAR: Deberá permitir solicitudes de origen cruzado cuando esté en modo de depuración. Con Chrome puedes usar este útil complemento .

EDITAR: Lea sobre el problema de RN github que me llevó a esta solución

Tryangul
fuente
4
Después de poner ese fragmento de código, puedo ver la solicitud en la Consola del desarrollador, pero todas mis solicitudes fallan con un estado 404. ¿Alguien tiene alguna idea de por qué podría suceder eso?
Peter_Fretter
1
Esto funciona. Tomé esto de Github
frevib
1
Esto no me funciona. Utilizo el emulador de Android y la pestaña de red muestra que se están enviando solicitudes vacías incluso
Ville Miekk-oja
19
Esto ya no funciona, aparece el siguiente error en la consola (no estoy seguro de qué cambio causó esto):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
Funciona de mi lado en React Native Debugger con esta configuración de una sola línea. Un millón de gracias, @tryangul
Kaloyan Kosev
87

No estoy seguro de por qué nadie ha señalado esta solución hasta ahora. Utilice React Native Debugger - https://github.com/jhen0409/react-native-debugger ! En mi opinión, es la mejor herramienta de depuración para React Native y ofrece inspección de red lista para usar.

Eche un vistazo a estas capturas de pantalla.

Haga clic derecho y seleccione 'Habilitar inspección de red' Habilitación de la inspección de red

Haga clic derecho y seleccione 'Habilitar inspección de red' Habilitación de la inspección de red

¡Depurar! Network Inspect en acción

Kashish Grover
fuente
10
Si está hojeando y ve esta respuesta, tenga en cuenta que DEBE hacer clic derecho y Enable Network Inspectpara que funcione. Por defecto, no es así.
Stephen Saucier
1
¡Esto funciona muy bien! Hará mi vida mucho más fácil.
Augusto Samamé Barrientos
1
Vaya, ¿por qué esta función está oculta al hacer clic con el botón derecho en el panel principal? Nunca supe que existía. Cambiador de juego. Las respuestas de Json no aparecían ... aparecen de inmediato al alternar. ¡Gracias!
Matt
2
¿Por qué esto no es más conocido? 🤷‍♂️
Tom Mulkins
1
Más bien, ¿por qué no es este el comportamiento predeterminado cada vez que visitamos la pestaña Red o marcamos como una configuración (casilla de verificación o algún tipo) dentro de esa pestaña?
CyberMew
46

Utilizo lo siguiente en mi aplicación (agregue esto en su archivo principal de punto de entrada app.js):

// 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;
  });
};

Lo mejor es que también muestra los registros de recuperación en la consola, que están bien formateados.

Captura de pantalla:

ingrese la descripción de la imagen aquí

En la pestaña de red:

ingrese la descripción de la imagen aquí

Sankalp Singha
fuente
¡Eso es genial! Gracias
DJ Forth
¿En qué punto de la solicitud original se dispara? De hecho, estoy pensando en usar esto como un mecanismo para disparar tokens de actualización si una respuesta tiene un 401. ¿Hay algún problema con eso?
tushar747
¡FANTÁSTICO Sankalp! He tenido problemas para hacer que Reacotron funcione sin bloquear mi constructor de Metro. Tu solución funciona muy bien. Incluso funciona en React Native Debugger.
mediaguru
El valor del encabezado 'Access-Control-Allow-Origin' en la respuesta no debe ser el comodín '*' cuando el modo de credenciales de la solicitud es 'incluir'. Por lo tanto, no se permite el acceso al origen ' localhost: 8081 '. El modo de credenciales de las solicitudes iniciadas por XMLHttpRequest está controlado por el atributo withCredentials.
Nikhil Mahirrao
Increíble. Muchas gracias
Mark
27

Utilizo Reactotron para rastrear solicitudes de red.

ingrese la descripción de la imagen aquí

Aung Myat Hein
fuente
3
esta es en realidad la mejor solución de todas las respuestas aquí (para mí) ... súper fácil de configurar y no tiene todos los efectos secundarios del uso de Chrome
Blue Bot
¿Cuáles son los efectos secundarios del uso de Chrome que le preocupan? Reactotron usa Chromium Embedded Framework.
Peter Evan Deal
increíble !! gracias me salvaste días de búsqueda en la red
Alain
12

Sé que esta es una pregunta antigua, pero hay una forma mucho más segura de hacer esto ahora que no requiere deshabilitar CORS o alterar el código fuente de React Native. Puede usar una biblioteca de terceros llamada Reactotron que no solo rastrea las llamadas a la API (usando el complemento de red), sino que también puede rastrear su tienda Redux y Sagas con una configuración adicional:

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

Jeb
fuente
Reactotron parecía funcionar solo si usaba una biblioteca externa llamada apisauce. No funciona para la recuperación normal. Entonces, si desea monitorear las solicitudes enviadas por bibliotecas externas en su aplicación, reactotron no es bueno.
Ville Miekk-oja
1
@ VilleMiekk-oja, de hecho, reactotron admite Networking with Fetch desde marzo, es solo que la documentación estaba desactualizada. Lo probé yo mismo y lo corregí en el archivo Léame :)
Juan Carlos Alpizar Chinchilla
esto funciona excelente; He visto muchos problemas con: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad
1
reactotron es realmente fácil de configurar y útil para rastrear llamadas de red de aplicaciones nativas de reacción
Ram
9

Pude depurar mis solicitudes en Chrome eliminando el polyfill que proporciona React Native después de importar React Native.

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

Esto funcionó para mí para las mismas solicitudes de origen. No estoy seguro si necesita deshabilitar CORS en Chrome para que funcione para el origen cruzado.

lanan
fuente
¿Qué es una solicitud de "mismo origen", en el contexto de las solicitudes realizadas desde una aplicación React Native? ¿Uno que esté en el mismo dominio que el depurador (es decir, probablemente localhost)?
Mark Amery
para mi caso, debe deshabilitar CORS en Chrome para que funcione para el origen cruzado. consulte este complemento de Chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul
@MouhamedHalloul, ¿puedes explicar cómo usaste este complemento?
alexmngn
@alexmngn hey, solo instala el complemento y enciéndelo deslizando el botón, el ícono debe ser verde cuando está encendido y rojo cuando está apagado, eso es todo. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul
5

En el pasado, usé GLOBAL.XMLHttpRequesthack para rastrear mis solicitudes de API, pero a veces es muy lento y no funcionó para solicitudes de activos. Decidí usar la Postman’s proxyfunción para inspeccionar la comunicación HTTP que sale del teléfono. Para obtener más detalles, consulte la documentación oficial , pero básicamente hay tres sencillos pasos:

  • Configurar el proxy en Postman
  • Verifique la dirección IP de su computadora ( $ ifconfig)
  • Configure el proxy HTTP en su dispositivo móvil en la configuración de wifi
mradziwon
fuente
5

Tenga cuidado con este código.

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

Ayuda y es genial, pero destruye la carga. Pasé 2 días tratando de averiguar por qué los archivos cargados envían [objeto Objeto] en lugar del archivo real. El motivo es un código anterior.

Úselo para llamadas regulares, pero no para llamadas multiparte / form-data

Dawid Dereszewski
fuente
2

Sugiero usar Charles para inspeccionar sus solicitudes de red. Es realmente bueno y proporciona más visibilidad y te permite hacer cosas avanzadas.

http://charlesproxy.com

Ran Yefet
fuente
1
Intenté con Charles y parece que solo captura http://localhost:8081/index.android.bundle?platform=android&dev=true... ¿cómo hacer que capture TODAS las solicitudes? (Estoy
usando
¿Su API externa utiliza HTTPS? Si es así, necesita configurar Charles un poco para capturarlos también.
Ran Yefet
cuando se usa Android, charles puede ser un poco problemático para capturar solicitudes salientes. necesita configurar 'manualmente' su simulador para acceder a charles (y la última vez que lo intenté, entrar en el panel de configuración no funcionaría; se necesitaba pasar la IP del proxy desde una instanciación de línea de comando).
joe
1

Si está buscando depurar solicitudes de red en una versión de lanzamiento de su aplicación, puede usar la biblioteca react-native-network-logger . Le permite monitorear y ver las solicitudes de red dentro de la aplicación desde una pantalla de depuración personalizada.

lista de registradores de redes nativos de reacción

detalles de react-native-network-logger

Luego, puede poner esto detrás de una marca de compilación o una marca de red para deshabilitarlo para los usuarios en la aplicación de producción.

Simplemente instálelo y yarn add react-native-network-loggerluego agregue esto en el punto de entrada de su aplicación:

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

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

Y esto en una pantalla de depuración:

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

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

Descargo de responsabilidad: soy el autor del paquete.

braza
fuente
¡Amigo, esta biblioteca es increíble! Gracias
Emidomenge
0

Si tiene un teléfono o emulador Android,

  • npx react-native start

Luego abre Android Studio .

Abra la androidcarpeta de su proyecto como un proyecto de Android Studio.

ingrese la descripción de la imagen aquí

Haga clic en ese icono azul que es Android Profiler

Después de que se inicie Android Profiler, puede agregar su aplicación a través del ícono gris más cerca de la SESSIONSetiqueta ingrese la descripción de la imagen aquí

Ahora puede inspeccionar las redes a través de esta herramienta. Puede ver triángulos que muestran la actividad de su red.

Consulte esto para obtener más información sobre cómo inspeccionar el tráfico de la red .

Muhammed Ozdogan
fuente
-25

Agregue el depurador en js donde puede ver la solicitud o la respuesta

Pramod Mg
fuente