Como posso ver as solicitações de rede (para depuração) no React Native?

102

Gostaria de ver minhas solicitações de rede no React Native para me ajudar a depurar - de preferência na guia 'Rede' dos devtools do Chrome.

Existem alguns problemas fechados sobre isso no GitHub ( https://github.com/facebook/react-native/issues/4122 e https://github.com/facebook/react-native/issues/934 ), mas eu não t compreendê-los inteiramente. Parece que preciso desfazer alguns polyfills do React Native e, em seguida, executar alguns comandos com sinalizadores de depuração extras e talvez modificar algumas configurações de segurança do Chrome. E, aparentemente, há alguns problemas de segurança envolvidos em fazer isso que podem tornar uma ideia terrível, mas ninguém envolvido na discussão declarou explicitamente o que são.

Alguém poderia fornecer um guia passo a passo para fazer a guia Rede funcionar com o React Native, bem como uma explicação dos problemas de segurança envolvidos em fazê-lo?

Mark Amery
fonte

Respostas:

91

Isso é o que estou usando no ponto de entrada do meu aplicativo

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

XMLHttpRequest = _XHR

EDIT: frevib vinculado à sintaxe mais concisa abaixo. Obrigado frevib!

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

Explicação:

GLOBAL.originalXMLHttpRequestrefere-se à cópia do Chrome Dev Tools de XHR. É fornecido pela RN como uma saída de emergência. A solução de Shvetusya só funcionará se as ferramentas de desenvolvimento estiverem abertas e, portanto, fornecendo XMLHttpRequest.

EDITAR: Você precisará permitir solicitações de origem cruzada quando estiver no modo de depuração. Com o Chrome, você pode usar este plugin útil .

EDIT: Leia sobre o problema do RN github que me levou a esta solução

Tryangul
fonte
4
Depois de colocar esse trecho de código, posso ver a solicitação no console do desenvolvedor, mas todas as minhas solicitações falham com um status 404. Alguém tem ideia do porque isso pode acontecer?
Peter_Fretter
1
Isso funciona.
Retirado
1
Isso não funciona para mim. Eu uso o emulador de Android, e a guia de rede mostra em branco que até mesmo as solicitações estão sendo enviadas
Ville Miekk-oja
19
Isso não funciona mais, o seguinte erro aparece no console (não tenho certeza de qual mudança causou isso):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
Trabalha do meu lado no React Native Debugger com esta configuração de uma linha. Obrigado um milhão de vezes, @tryangul
Kaloyan Kosev
87

Não sei por que ninguém apontou essa solução até agora. Use React Native Debugger - https://github.com/jhen0409/react-native-debugger ! É a melhor ferramenta de depuração para React Native na minha opinião e oferece Inspeção de Rede fora da caixa.

Dê uma olhada nessas imagens.

Clique com o botão direito e selecione 'Habilitar Inspeção de Rede' Habilitando a inspeção de rede

Clique com o botão direito e selecione 'Habilitar Inspeção de Rede' Habilitando a inspeção de rede

Depure! Inspeção de rede em ação

Kashish Grover
fonte
10
Se você estiver lendo rapidamente e vir esta resposta, observe que você DEVE clicar com o botão direito do mouse Enable Network Inspectpara que funcione. Por padrão, isso não acontece.
Stephen Saucier
1
Isso funciona muito bem! Vai tornar minha vida muito mais fácil.
Augusto Samamé Barrientos
1
Uau, por que esse recurso está oculto com um clique com o botão direito no painel principal. Nunca soube que existia. Jogador desafiante. As respostas de Json não estavam aparecendo ... apareciam imediatamente no botão de alternar. Obrigado!
Matt
2
Por que isso não é mais conhecido? 🤷‍♂️
Tom Mulkins
1
Mais como por que este não é o comportamento padrão sempre que visitamos a guia Rede ou marcamos como uma configuração (caixa de seleção ou algum tipo) dentro dessa guia!
CyberMew
46

Eu uso o seguinte em meu aplicativo (adicione isso em seu arquivo de ponto de entrada app.js principal):

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

A melhor coisa é que ele também mostra os logs de busca no console, que estão bem formatados.

Captura de tela:

insira a descrição da imagem aqui

Na guia rede:

insira a descrição da imagem aqui

Sankalp Singha
fonte
Fantástico! Obrigado
DJ Forth
Em que ponto da solicitação original isso é disparado? Na verdade, estou pensando em usar isso como um mecanismo para disparar tokens de atualização se uma resposta tiver um 401. Há um problema com isso?
tushar747
FANTASTIC Sankalp! Tive problemas para fazer o Reacotron funcionar sem travar meu construtor Metro. Sua solução funciona muito bem. Até funciona no React Native Debugger.
mediaguru
O valor do cabeçalho 'Access-Control-Allow-Origin' na resposta não deve ser o caractere curinga '*' quando o modo de credenciais da solicitação é 'incluir'. Origem ' localhost: 8081 ', portanto, não tem acesso permitido. O modo de credenciais de solicitações iniciadas pelo XMLHttpRequest é controlado pelo atributo withCredentials.
Nikhil Mahirrao
Impressionante. Muito obrigado
Marcos
27

Eu uso o Reactotron para rastrear solicitações de rede.

insira a descrição da imagem aqui

Aung Myat Hein
fonte
3
esta é na verdade a melhor solução de todas as respostas aqui (para mim) .. super fácil de configurar e não tem todos os efeitos colaterais do uso do cromo
Blue Bot
Quais são os efeitos colaterais do uso do cromo com que você está preocupado? O Reactotron usa o Chromium Embedded Framework.
Peter Evan Deal
impressionante !! obrigado você me salvou dias de pesquisa na net
Alain
12

Eu sei que esta é uma pergunta antiga, mas há uma maneira muito mais segura de fazer isso agora que não requer a desativação do CORS ou a alteração do código-fonte do React Native. Você pode usar uma biblioteca de terceiros chamada Reactotron que não apenas rastreia chamadas de API (usando o plug-in de rede), mas também pode rastrear sua loja Redux e Sagas com configuração adicional:

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

Jeb
fonte
Reactotron parecia funcionar apenas se você usasse uma biblioteca externa chamada apisauce. Não funciona para busca normal. Portanto, se você deseja monitorar solicitações enviadas por bibliotecas externas em seu aplicativo, o reactotron não é bom.
Ville Miekk-oja
1
@ VilleMiekk-oja na verdade o reactotron suporta Networking with Fetch desde março, é só que a documentação estava desatualizada. Eu tentei sozinho e corrigi no readme :)
Juan Carlos Alpizar Chinchilla
isso funciona excelente; Já vi tantos problemas com: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad
1
reactotron é realmente fácil de configurar e útil para rastrear chamadas de rede de aplicativos react-nativos
Ram
9

Consegui depurar minhas solicitações no Chrome, excluindo polyfill que o React Native fornece após importar o React Native.

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

Isso funcionou para mim para solicitações da mesma origem. Não tenho certeza se você precisa desativar o CORS no Chrome para fazê-lo funcionar para origem cruzada.

Lanan
fonte
O que é uma solicitação de "mesma origem", no contexto de solicitações feitas de um aplicativo React Native? Um que esteja no mesmo domínio do depurador (ou seja, provavelmente localhost)?
Mark Amery
no meu caso, você deve desativar o CORS no Chrome para fazê-lo funcionar para origens cruzadas. verifique este plug-in do Chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul
@MouhamedHalloul você pode explicar como você usou este plugin?
alexmngn
@alexmngn ei, basta instalar o plugin e ligá-lo deslizando o botão, o ícone deve ficar verde quando estiver ligado e vermelho quando estiver desligado é isso. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul
5

No passado, usei o GLOBAL.XMLHttpRequesthack para rastrear minhas solicitações de API, mas às vezes é muito lento e não funcionava para solicitações de ativos. Decidi usar o Postman’s proxyrecurso para inspecionar a comunicação HTTP saindo do telefone. Para obter detalhes, consulte a documentação oficial , mas, basicamente, existem três etapas fáceis:

  • Configure o proxy no Postman
  • Verifique o endereço IP do seu computador ( $ ifconfig)
  • Configure o proxy HTTP em seu dispositivo móvel nas configurações de wi-fi
Mradziwon
fonte
5

Tenha cuidado com este código.

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

Ajuda e é ótimo, mas destrói o upload. Passei 2 dias tentando descobrir por que os arquivos carregados estão enviando [objeto Object] em vez do arquivo real. O motivo é um código acima.

Use-o para chamadas regulares, não mas para chamadas multipart / form-data

Dawid Dereszewski
fonte
2

Eu sugiro usar Charles para inspecionar suas solicitações de rede. É realmente bom e fornece mais visibilidade e permite que você faça coisas avançadas.

http://charlesproxy.com

Ran Yefet
fonte
1
Apenas tentei Charles e parece apenas capturar http://localhost:8081/index.android.bundle?platform=android&dev=true.. como fazê-lo capturar TODOS os pedidos? (Estou atingindo uma API externa)
jakeforaker
A sua API externa usa HTTPS? Nesse caso, você precisa configurar o Charles um pouco para pegá-los também.
Ran Yefet
ao usar o Android, Charles pode ser um pouco problemático para capturar solicitações de saída. você precisa configurar 'manualmente' seu simulador para acessar Charles (e da última vez que tentei, ir ao painel de configuração não funcionaria - o IP do proxy precisava ser passado a partir de uma instanciação de linha de comando).
joe
1

Se você deseja depurar solicitações de rede em uma versão de lançamento de seu aplicativo, pode usar a biblioteca react-native-network-logger . Ele permite monitorar e visualizar solicitações de rede dentro do aplicativo a partir de uma tela de depuração personalizada.

lista react-native-network-logger

detalhes do react-native-network-logger

Você pode então colocar isso atrás de um sinalizador de construção ou um sinalizador de rede para desativá-lo para usuários no aplicativo de produção.

Basta instalá-lo com yarn add react-native-network-loggere adicionar no ponto de entrada do seu aplicativo:

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

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

E isso em uma tela de depuração:

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

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

Isenção de responsabilidade: eu sou o autor do pacote.

braza
fonte
Cara, essa lib é demais! Obrigado
Emidomenge
0

Se você tiver um telefone ou emulador Android,

  • npx react-native start

Em seguida, abra o Android Studio .

Abra a androidpasta do seu projeto como um projeto do Android Studio.

insira a descrição da imagem aqui

Clique no ícone azul, que é o Android Profiler

Após o início do Android Profiler, você pode adicionar seu aplicativo por meio do ícone de adição cinza próximo ao SESSIONSrótulo insira a descrição da imagem aqui

Agora você pode inspecionar a rede por meio desta ferramenta. Você pode ver triângulos que mostram sua atividade de rede.

Verifique isso para obter mais informações sobre como inspecionar o tráfego de rede .

Muhammed Ozdogan
fonte
-25

Adicione Debugger no js onde você pode ver o req ou a resposta

Pramod Mg
fonte