2015-11-30 6 views
29

Ich möchte meine Netzwerkanforderungen in React Native anzeigen, um beim Debuggen zu helfen - am besten auf der Registerkarte "Netzwerk" der Chrome-Devtools.Wie kann ich Netzwerkanforderungen (zum Debuggen) in React Native anzeigen?

Es gibt einige geschlossene Fragen dazu auf GitHub (https://github.com/facebook/react-native/issues/4122 und https://github.com/facebook/react-native/issues/934), aber ich verstehe sie nicht vollständig. Es klingt, als müsste ich einige der Polyfills von React Native rückgängig machen und dann einige Befehle mit zusätzlichen Debug-Flags ausführen und vielleicht einige Chrome-Sicherheitseinstellungen ändern? Und anscheinend gibt es einige Sicherheitsprobleme, die dabei eine schreckliche Idee machen könnten, aber niemand, der in den Thread involviert ist, hat explizit gesagt, was sie sind.

Könnte jemand eine Schritt-für-Schritt-Anleitung für die Arbeit mit der Registerkarte "Netzwerk" auf der Registerkarte "Netzwerk" bereitstellen und eine Erläuterung der damit verbundenen Sicherheitsprobleme geben?

Antwort

-10

Add Debugger in den js, wo Sie die erf oder Antwort sehen

4

ich in der Lage war, meine Wünsche in Chrome zu debuggen, indem polyfill löschen, die Mutter Reaktion liefert nach india Reagieren importieren.

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

Dies funktionierte für mich für die gleichen Ursprungsanforderungen. Ich bin mir nicht sicher, ob Sie CORS in Chrome deaktivieren müssen, damit es für den Ursprung funktioniert.

+0

Was ist ein „samt origin“ Antrag im Rahmen von Anfragen von einem nativen App Reagieren gemacht? Eine, die auf der gleichen Domäne wie der Debugger ist (d. H. Wahrscheinlich localhost)? –

+0

für meinen Fall müssen Sie CORS in Chrome deaktivieren, damit es für den Ursprung funktioniert. Schau dir dieses Chrome-Plugin an: https: //chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkbbhhdihlkkiljbi? hl = fr –

+0

@MouhamedHalloul kannst du erklären, wie du dieses Plugin benutzt hast? – alexmngn

1

Ich schlage vor, mit Charles Ihre Netzwerkanforderungen zu überprüfen. Es ist wirklich gut und bietet mehr Sichtbarkeit und ermöglicht es Ihnen, erweiterte Sachen zu tun.

http://charlesproxy.com

+1

Just versuchte Charles und es scheint nur zu erfassen: http: // localhost: 8081 /index.android.bundle? platform = android & dev = true' ... wie kann man ALLE Anfragen erfassen? (Ich treffe eine externe API) – jakeed1

+0

Verwendet Ihre externe API HTTPS? Wenn ja, müssen Sie Charles ein wenig konfigurieren, um auch diese zu fangen. –

43

Dies ist, was ich habe in der Einstiegspunkt meiner App

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

XMLHttpRequest = _XHR 

EDIT: unter frevib verknüpft kürzere Syntax. Danke frevib!

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

Erläuterung:

GLOBAL.originalXMLHttpRequest bezieht sich die die Chrome Dev-Tools von XHR kopieren. Es wird von RN als Notluke zur Verfügung gestellt. Shvetusyas Lösung funktioniert nur, wenn die Dev-Tools geöffnet sind und somit XMLHttpRequest bereitstellen.

BEARBEITEN: Im Debugger-Modus müssen Sie Cross-Ursprungsanforderungen zulassen. Mit Chrom können Sie this handy plugin verwenden.

EDIT: Read about the RN github issue, die mich zu dieser Lösung führen

+1

Nachdem ich diesen Code eingefügt habe, kann ich die Anfrage in der Entwicklerkonsole sehen, aber alle meine Anfrage scheitert mit einem 404-Status. Jeder hat eine Idee, warum das passieren könnte? –

+0

XMLHttpRequest ist nicht definiert :( –

+1

Dies funktioniert. Nahm dies von [Github] (https://github.com/facebook/react-native/issues/934#issuecomment-269811544) – frevib

10

ich folgend in meiner app (Fügen Sie diese in Ihrer Haupt-app.js Einstiegspunkt Datei):

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

Das Beste ist, dass Es zeigt auch die Fetch-Protokolle in der Konsole, die gut formatiert sind.

Screenshot:

enter image description here

auf dem Registerkarte Netzwerk:

enter image description here

+0

React-Native bestätigt zu arbeiten! Vielen Dank. – PubNub

5

Ich weiß, dass dies eine alte Frage, aber es gibt einen viel sichereren Weg, dies jetzt zu tun, dass nicht den Fall ist erfordert, CORS zu deaktivieren oder den Quellcode von React Native zu ändern. Sie können eine Dritte Bibliothek Reactotron genannt verwenden, das nicht nur API-Aufrufe verfolgt (die Netzwerk-Plugin), sondern auch Ihre Redux speichern und Sagas mit zusätzlichen Setup verfolgen:

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

+0

Reactotron schien nur zu arbeiten, wenn Sie externe Bibliothek namens Apisauce verwendet.Es funktioniert nicht für normalen Abruf. Also, wenn Sie Anfragen von externen Bibliotheken in Ihrer App überwachen möchten, ist reactotron nicht gut. –

+0

@ VilleMiekk-oja in der Tat reactotron unterstützt Vernetzung mit Fetch seit März, es ist nur die Dokumentation war veraltet. Ich habe es selbst ausprobiert und es auf der Readme korrigiert :) –

0

In der Vergangenheit Ich habe GLOBAL.XMLHttpRequest Hack verwendet, um meine API-Anfragen zu verfolgen, aber manchmal ist es sehr langsam und funktionierte nicht für Assets Anfragen. Ich entschied mich, Postman’s proxy Funktion zu verwenden, um die HTTP-Kommunikation zu überprüfen, die vom Telefon ausgeht. Für Details sehen Sie die official documentation, aber im Grunde gibt es drei einfache Schritte:

  • den Proxy in Postman
  • Ihren Computer überprüfen IP-Adresse einrichten ($ ifconfig)
  • Konfigurieren von HTTP-Proxy auf Ihrem Mobilgerät in WLAN-Einstellungen
0

Bitte seien Sie vorsichtig mit diesem Code.

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

Es hilft und es ist toll, aber es zerstört den Upload. Ich verbringe 2 Tage damit, herauszufinden, warum hochgeladene Dateien [object Object] anstelle der realen Datei senden. Der Grund ist ein Code oben.

Verwenden Sie es für normale Anrufe nicht aber für multipart/form-data ruft