Jak mogę wyświetlać żądania sieciowe (do debugowania) w React Native?

105

Chciałbym przeglądać moje żądania sieciowe w React Native, aby pomóc mi w debugowaniu - najlepiej w zakładce „Sieć” w Devtools Chrome.

Jest kilka zamkniętych problemów na ten temat w GitHub ( https://github.com/facebook/react-native/issues/4122 i https://github.com/facebook/react-native/issues/934 ), ale nie robię tego całkowicie je rozumiem. Wygląda na to, że muszę cofnąć niektóre polyfills React Native, a następnie uruchomić kilka poleceń z dodatkowymi flagami debugowania i może zmodyfikować niektóre ustawienia zabezpieczeń Chrome? I najwyraźniej wiąże się to z pewnymi kwestiami bezpieczeństwa, które mogą sprawić, że będzie to okropny pomysł, ale nikt zaangażowany w ten wątek wyraźnie nie określił, czym one są.

Czy ktoś mógłby podać przewodnik krok po kroku, jak uruchomić kartę Sieć w React Native, a także wyjaśnić związane z tym kwestie bezpieczeństwa?

Mark Amery
źródło

Odpowiedzi:

92

Nie jestem pewien, dlaczego nikt do tej pory nie wskazał na to rozwiązanie. Użyj React Native Debugger - https://github.com/jhen0409/react-native-debugger ! Moim zdaniem jest to najlepsze narzędzie do debugowania React Native i zapewnia inspekcję sieci po wyjęciu z pudełka.

Spójrz na te zrzuty ekranu.

Kliknij prawym przyciskiem myszy i wybierz „Włącz inspekcję sieci” Włączanie inspekcji sieci

Kliknij prawym przyciskiem myszy i wybierz „Włącz inspekcję sieci” Włączanie inspekcji sieci

Debuguj! Network Inspect w akcji

Kashish Grover
źródło
10
Jeśli przeglądasz i widzisz tę odpowiedź, pamiętaj, że MUSISZ kliknąć prawym przyciskiem myszy i Enable Network Inspectaby zadziałało. Domyślnie tak nie jest.
Stephen Saucier
1
To działa świetnie! Znacznie ułatwi mi życie.
Augusto Samamé Barrientos
1
Wow, dlaczego ta funkcja jest ukryta po kliknięciu prawym przyciskiem myszy na głównym panelu. Nigdy nie wiedziałem, że istnieje. Zmieniacz gier. Odpowiedzi JSON nie były wyświetlane ... pojawiają się od razu po przełączeniu. Dzięki!
Matt
2
Dlaczego nie jest to szerzej znane? 🤷‍♂️
Tom Mulkins
1
Bardziej na przykład, dlaczego nie jest to domyślne zachowanie za każdym razem, gdy odwiedzamy kartę Sieć lub zaznaczamy jako ustawienie (pole wyboru lub niektóre rodzaje) na tej karcie!
CyberMew
92

To jest to, czego używałem w punkcie wejścia mojej aplikacji

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

XMLHttpRequest = _XHR

EDYCJA: frevib połączony z bardziej zwięzłą składnią poniżej. Dzięki frevib!

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

Wyjaśnienie:

GLOBAL.originalXMLHttpRequestodnosi się do kopii XHR w Chrome Dev Tools. Jest dostarczany przez RN jako właz ratunkowy. Rozwiązanie Shvetusya będzie działać tylko wtedy, gdy narzędzia programistyczne są otwarte, a tym samym zapewniają XMLHttpRequest.

EDYCJA: Musisz zezwolić na żądania między źródłami w trybie debugera. W Chrome możesz użyć tej przydatnej wtyczki .

EDYCJA: Przeczytaj o problemie z RN na githubie, który doprowadził mnie do tego rozwiązania

tryangul
źródło
4
Po umieszczeniu tego fragmentu kodu mogę zobaczyć żądanie w Konsoli programisty, ale wszystkie moje żądania kończą się niepowodzeniem ze stanem 404. Czy ktoś ma pojęcie, dlaczego tak się stało?
Peter_Fretter
1
To działa. Wziąłem to z Github
frevib,
1
To nie działa na mnie. Używam emulatora Androida, a zakładka sieci pokazuje puste, nawet żądania są wysyłane
Ville Miekk-oja
19
To już nie działa, w konsoli pojawia się następujący błąd (nie wiem, jaka zmiana to spowodowała):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
Działa po mojej stronie w React Native Debugger z tą jedną linijką konfiguracji. Dzięki milion razy, @tryangul
Kaloyan Kosev
46

W mojej aplikacji używam następujących elementów (dodaj to w głównym pliku punktu wejścia 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;
  });
};

Najlepsze jest to, że pokazuje również dzienniki pobierania w konsoli, które są dobrze sformatowane.

Zrzut ekranu:

wprowadź opis obrazu tutaj

Na karcie sieci:

wprowadź opis obrazu tutaj

Sankalp Singha
źródło
To cudownie! Dziękuję
DJ Forth
W którym momencie pierwotnego żądania jest to uruchamiane? Właściwie myślę o użyciu tego jako mechanizmu odpalania tokenów odświeżania, jeśli odpowiedź ma 401. Czy jest z tym problem?
tushar747
FANTASTYCZNY Sankalp! Mam problemy z uruchomieniem Reacotron bez awarii mojego konstruktora Metro. Twoje rozwiązanie działa świetnie. Działa nawet w React Native Debugger.
mediaguru
Wartość nagłówka „Access-Control-Allow-Origin” w odpowiedzi nie może być symbolem wieloznacznym „*”, gdy tryb poświadczeń żądania to „include”. Dlatego źródłolocalhost: 8081 ” nie ma dostępu. Tryb poświadczeń żądań inicjowanych przez XMLHttpRequest jest kontrolowany przez atrybut withCredentials.
Nikhil Mahirrao
Niesamowite. Dziękuję bardzo
Mark
27

Używam Reactotron do śledzenia żądań sieciowych.

wprowadź opis obrazu tutaj

Aung Myat Hein
źródło
3
jest to właściwie najlepsze rozwiązanie ze wszystkich odpowiedzi tutaj (dla mnie) .. super łatwe w konfiguracji i nie ma wszystkich skutków ubocznych używania chromu
Blue Bot
Jakie są skutki uboczne używania chromu, o które się martwisz? Reactotron wykorzystuje wbudowaną strukturę Chromium.
Peter Evan Deal
niesamowite !! dzięki zaoszczędziłeś mi dni na szukaniu w sieci
Alain
12

Wiem, że to stare pytanie, ale teraz jest o wiele bezpieczniejszy sposób, aby to zrobić, który nie wymaga wyłączania CORS lub zmiany kodu źródłowego React Native. Możesz użyć biblioteki innej firmy o nazwie Reactotron, która nie tylko śledzi wywołania API (za pomocą wtyczki sieciowej), ale także może śledzić Twój sklep Redux i Sagas z dodatkową konfiguracją:

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

Jeb
źródło
Reactotron wydawał się działać tylko wtedy, gdy korzystałeś z zewnętrznej biblioteki o nazwie apisauce. Nie działa w przypadku normalnego pobierania. Jeśli więc chcesz monitorować żądania wysyłane przez biblioteki zewnętrzne w swojej aplikacji, reaktor nie jest dobry.
Ville Miekk-oja
1
@ VilleMiekk-oja w rzeczywistości reaktotron obsługuje połączenia sieciowe z Fetch od marca, to tylko dokumentacja była nieaktualna. Sam go wypróbowałem i poprawiłem w
pliku
to działa doskonale; Widziałem wiele problemów z: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad,
1
Reactotron jest naprawdę łatwy w konfiguracji i przydatny do śledzenia wywołań sieciowych aplikacji responsywnych
Ram
9

Udało mi się debugować moje żądania w Chrome, usuwając polyfill, który zapewnia React Native po zaimportowaniu React Native.

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

To zadziałało dla mnie dla tych samych żądań pochodzenia. Nie jestem pewien, czy musisz wyłączyć CORS w Chrome, aby działał dla różnych źródeł.

lanan
źródło
Co to jest żądanie „tego samego źródła” w kontekście żądań wysyłanych z aplikacji React Native? Taki, który znajduje się w tej samej domenie co debugger (tj. Prawdopodobnie localhost)?
Mark Amery,
w moim przypadku musisz wyłączyć CORS w Chrome, aby działał dla cross origin. sprawdź tę wtyczkę Chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul
@MouhamedHalloul czy możesz wyjaśnić, w jaki sposób korzystałeś z tej wtyczki?
alexmngn
@alexmngn hej, po prostu zainstaluj wtyczkę i włącz ją, przesuwając przycisk, ikona powinna być zielona, ​​gdy jest włączona, a czerwona, gdy jest wyłączona. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul
5

W przeszłości używałem GLOBAL.XMLHttpRequesthacka do śledzenia moich żądań API, ale czasami jest to bardzo powolne i nie działa w przypadku żądań zasobów. Postanowiłem użyć Postman’s proxyfunkcji do sprawdzenia komunikacji HTTP wychodzącej z telefonu. Aby uzyskać szczegółowe informacje, zapoznaj się z oficjalną dokumentacją , ale zasadniczo są trzy proste kroki:

  • Skonfiguruj serwer proxy w programie Postman
  • Sprawdź adres IP swojego komputera ( $ ifconfig)
  • Skonfiguruj serwer proxy HTTP na swoim urządzeniu mobilnym w ustawieniach Wi-Fi
mradziwon
źródło
5

Uważaj na ten kod.

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

Pomaga i jest świetny, ale niszczy przesyłanie. Spędziłem 2 dni próbując dowiedzieć się, dlaczego przesłane pliki wysyłają [obiekt obiektu] zamiast prawdziwego pliku. Powodem jest powyższy kod.

Używaj go nie do zwykłych połączeń, ale do połączeń typu multipart / form-data

Dawid Dereszewski
źródło
2

Proponuję użyć Charlesa do sprawdzenia żądań sieciowych. Jest naprawdę dobry i zapewnia lepszą widoczność i pozwala robić zaawansowane rzeczy.

http://charlesproxy.com

Ran Yefet
źródło
1
Właśnie wypróbowałem Charlesa i wydaje się, że tylko przechwytuje http://localhost:8081/index.android.bundle?platform=android&dev=true... jak sprawić, by przechwytywał WSZYSTKIE żądania? (Uderzam w zewnętrzny interfejs API)
jakeforaker
Czy Twój zewnętrzny interfejs API korzysta z protokołu HTTPS? Jeśli tak, musisz trochę skonfigurować Charlesa, aby je również złapać.
Biegałem Yefet
podczas korzystania z Androida charles może mieć nieco problem z przechwytywaniem żądań wychodzących. musisz „ręcznie” skonfigurować symulator, aby uzyskać dostęp do charles (a ostatnio, gdy próbowałem, przejście do panelu konfiguracyjnego nie wykonało zadania - IP proxy musiało być przekazane z instancji wiersza poleceń).
joe
2

Jeśli chcesz debugować żądania sieciowe w wydanej wersji swojej aplikacji, możesz użyć biblioteki React-native-network-logger . Umożliwia monitorowanie i przeglądanie żądań sieciowych w aplikacji z niestandardowego ekranu debugowania.

lista react-native-network-logger

szczegóły react-native-network-logger

Następnie możesz umieścić to za flagą kompilacji lub flagą sieci, aby wyłączyć ją dla użytkowników w aplikacji produkcyjnej.

Po prostu zainstaluj go za pomocą, yarn add react-native-network-loggera następnie dodaj to w punkcie wejścia swojej aplikacji:

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

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

A to na ekranie debugowania:

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

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

Zastrzeżenie: jestem autorem pakietu.

braza
źródło
Koleś, ta biblioteka jest niesamowita! Dziękuję
Emidomenge
0

Jeśli masz telefon z Androidem lub emulator,

  • npx react-native start

Następnie otwórz Android Studio .

Otwórz androidfolder swojego projektu jako projekt Android Studio.

wprowadź opis obrazu tutaj

Kliknij tę niebieską ikonę, która jest Android Profiler

Po uruchomieniu programu Android Profiler możesz dodać swoją aplikację za pomocą szarej ikony plusa obok SESSIONSetykiety wprowadź opis obrazu tutaj

Teraz możesz sprawdzić sieć za pomocą tego narzędzia. Możesz zobaczyć trójkąty, które pokazują Twoją aktywność w sieci.

Sprawdź to, aby uzyskać więcej informacji na temat sprawdzania ruchu sieciowego .

Muhammed Ozdogan
źródło
-26

Dodaj Debugger w js, gdzie możesz zobaczyć żądanie lub odpowiedź

Pramod Mg
źródło