React Native'de ağ isteklerini (hata ayıklama için) nasıl görüntüleyebilirim?


111

Ağ isteklerimi, hata ayıklamama yardımcı olması için React Native'de görmek istiyorum - ideal olarak Chrome'un geliştiricilerinin 'Ağ' sekmesinde.

GitHub'da bununla ilgili bazı kapalı sorunlar var ( https://github.com/facebook/react-native/issues/4122 ve https://github.com/facebook/react-native/issues/934 ) ama yapmıyorum t tamamen anlamak. React Native'in bazı çoklu dolgularını geri almam ve ardından fazladan hata ayıklama bayraklarıyla bazı komutlar çalıştırmam ve belki bazı Chrome güvenlik ayarlarını değiştirmem gerekiyor gibi görünüyor. Görünüşe göre, bunu yaparken onu korkunç bir fikir haline getirebilecek bazı güvenlik sorunları var, ancak iş parçacığına dahil olan hiç kimse bunların ne olduğunu açıkça belirtmedi.

Birisi, Ağ sekmesinin React Native ile çalışmasını sağlamak için adım adım bir kılavuzun yanı sıra bununla ilgili güvenlik sorunlarının bir açıklamasını sağlayabilir mi?

Yanıtlar:


110

Şimdiye kadar neden kimsenin bu çözüme işaret etmediğinden emin değilim. React Native Debugger'ı kullanın - https://github.com/jhen0409/react-native-debugger ! Bence React Native için en iyi hata ayıklama aracıdır ve Network Inspection'ı kutudan çıkarır.

Bu ekran görüntülerine bir göz atın.

Sağ tıklayın ve 'Ağ Denetimini Etkinleştir'i seçin Network Inspect'i Etkinleştirme

Sağ tıklayın ve 'Ağ Denetimini Etkinleştir'i seçin Network Inspect'i Etkinleştirme

Hata ayıklayın! Network Inspect iş başında


11
Gözden geçiriyorsanız ve bu yanıtı görüyorsanız, Enable Network Inspectçalışması için sağ tıklamanız GEREKİR . Varsayılan olarak öyle değildir.
Stephen Saucier

1
Bu harika çalışıyor! Hayatımı çok kolaylaştıracak.
Augusto Samamé Barrientos

3
Vay canına, bu özellik neden ana panelde sağ tıklama ile gizleniyor? Var olduğunu hiç bilmiyordum. Oyun değiştirici. Json yanıtları görünmüyordu ... geçişte hemen görünür. Teşekkürler!
Matt

2
Bu neden daha yaygın olarak bilinmiyor? 🤷‍♂️
Tom Mulkins

2
Daha çok, Ağ sekmesini her ziyaret ettiğimizde veya o sekme içinde bir ayar olarak işaretlediğimizde (onay kutusu veya bazı türler) neden bu varsayılan davranış değil?
CyberMew

94

Uygulamamın giriş noktasında kullandığım şey bu

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

XMLHttpRequest = _XHR

DÜZENLEME: frevib aşağıda daha kısa sözdizimiyle bağlantılı. Teşekkürler frevib!

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

Açıklama:

GLOBAL.originalXMLHttpRequestXHR'nin Chrome Geliştirici Araçları kopyasını ifade eder. RN tarafından bir kaçış kapağı olarak sağlanır. Shvetusya'nın çözümü yalnızca dev araçları açıksa ve bu nedenle sağlanırsa işe yarayacaktır XMLHttpRequest.

DÜZENLEME: Hata ayıklayıcı modundayken çapraz kaynak isteklerine izin vermeniz gerekecektir. Chrome ile bu kullanışlı eklentiyi kullanabilirsiniz .

DÜZENLEME: Beni bu çözüme götüren RN github sorunu hakkında bilgi edinin


4
Bu kodu yerleştirdikten sonra, isteği Developer Console'da görebiliyorum, ancak tüm isteğim 404 durumuyla başarısız oluyor. Bunun neden olabileceğine dair bir fikri olan var mı?
Peter_Fretter

1
Bu çalışıyor. Bu sürdü Github
frevib

1
Bu benim için çalışmıyor. Android öykünücüsü kullanıyorum ve ağ sekmesi boş, hatta isteklerin gönderildiğini gösteriyor
Ville Miekk-oja

19
Bu artık çalışmıyor, konsolda aşağıdaki hata çıkıyor (buna hangi değişikliğin neden olduğundan emin değilim):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
Bu tek satırlık kurulumla React Native Debugger'da benim tarafımda çalışıyor . Milyonlarca kez teşekkürler, @tryangul
Kaloyan Kosev

46

Uygulamamda aşağıdakileri kullanıyorum (Bunu ana app.js giriş noktası dosyanıza ekleyin):

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

En iyi şey, konsolda iyi biçimlendirilmiş getirme günlüklerini de göstermesidir.

Ekran görüntüsü:

görüntü açıklamasını buraya girin

Ağ sekmesinde:

görüntü açıklamasını buraya girin


Bu harika! Teşekkürler
DJ Forth

Bu, asıl talebin hangi noktasında ateşleniyor? Aslında bunu, bir yanıtta 401 varsa, yenileme belirteçlerini ateşlemek için bir mekanizma olarak kullanmayı düşünüyorum. Bununla ilgili bir sorun var mı?
tushar747

FANTASTİK Sankalp! Metro kurucumu çökertmeden Reacotron'u çalıştırmakta sorun yaşadım. Çözümünüz harika çalışıyor. React Native Debugger'da bile çalışır.
mediaguru

Yanıttaki 'Access-Control-Allow-Origin' başlığının değeri, isteğin kimlik bilgileri modu 'include' olduğunda '*' joker karakteri olmamalıdır. Menşe ' localhost: 8081 ' bu nedenle erişime izin verilmiyor. XMLHttpRequest tarafından başlatılan isteklerin kimlik bilgileri modu withCredentials özniteliği tarafından kontrol edilir.
Nikhil Mahirrao

Harika. Çok teşekkür ederim
Mark

28

Ağ talebini izlemek için Reactotron kullanıyorum .

görüntü açıklamasını buraya girin


3
bu aslında buradaki tüm cevaplar arasında en iyi çözümdür (benim için) .. kurulumu çok kolay ve krom kullanmanın tüm yan etkilerine sahip değil
Blue Bot

Endişelendiğiniz krom kullanmanın yan etkileri nelerdir? Reactotron, Chromium Embedded Framework'ü kullanır.
Peter Evan Deal

harika !! teşekkürler bana internette arama günlerinden kurtardın
Alain

Mine cihaza bağlı ancak her isteği yakalamıyor, sadece ilk yüklemede. Neden?
Jeaf Gilbert

12

Bunun eski bir soru olduğunu biliyorum, ancak şimdi bunu yapmanın CORS'u devre dışı bırakmayı veya React Native kaynak kodunu değiştirmeyi gerektirmeyen çok daha güvenli bir yolu var. Yalnızca API çağrılarını izlemekle kalmayan (ağ eklentisini kullanarak), aynı zamanda Redux mağazanızı ve Sagas'ı ek kurulumla izleyebilen Reactotron adlı üçüncü taraf bir kitaplık kullanabilirsiniz:

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


Reactotron yalnızca apisauce adlı harici bir kitaplık kullandıysanız işe yarıyor gibi görünüyordu. Normal getirme için çalışmaz. Dolayısıyla, uygulamanızda harici kitaplıklar tarafından gönderilen istekleri izlemek istiyorsanız, reactotron işe yaramaz.
Ville Miekk-oja

1
@ VilleMiekk-oja aslında reactotron, Mart ayından bu yana Fetch ile Ağ Oluşturmayı destekliyor, sadece dokümantasyon güncelliğini yitirmişti. Kendim denedim ve benioku sayfasında düzelttim :)
Juan Carlos Alpizar Chinchilla

bu mükemmel çalışıyor; GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad

1
reactotron'un yapılandırılması gerçekten kolay ve react-native uygulamaların ağ çağrılarını izlemek için kullanışlıdır
Ram

9

React Native'i içe aktardıktan sonra React Native'in sağladığı polyfill'i silerek Chrome'daki isteklerimde hata ayıklayabildim.

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

Bu benim için aynı menşe talepleri için çalıştı. Çapraz kaynak için çalışmasını sağlamak için Chrome'da CORS'u devre dışı bırakmanız gerekip gerekmediğinden emin değilim.


React Native uygulamasından yapılan istekler bağlamında "aynı kaynak" isteği nedir? Hata ayıklayıcı ile aynı etki alanında bulunan (yani muhtemelen localhost)?
Mark Amery

benim durumum için, çapraz kaynak için çalışmasını sağlamak için Chrome'da CORS'u devre dışı bırakmanız gerekiyor. bu chrome eklentisini kontrol edin: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul

@MouhamedHalloul, bu eklentiyi nasıl kullandığınızı açıklayabilir misiniz?
alexmngn

@alexmngn hey, sadece eklentiyi kurun ve düğmeyi kaydırarak açın, simge açıkken yeşil, kapalı olduğunda kırmızı olmalıdır. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul

6

Lütfen bu koda dikkat edin.

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

Yardımcı oluyor ve harika ama yüklemeyi yok ediyor. Yüklenen dosyaların neden gerçek dosya yerine [nesne Nesnesi] gönderdiğini anlamaya çalışmak için 2 gün harcıyorum. Nedeni yukarıdaki bir koddur.

Normal aramalar için değil, çok parçalı / form veri aramaları için kullanın


5

Geçmişte GLOBAL.XMLHttpRequestAPI isteklerimi izlemek için hack kullandım, ancak bazen çok yavaş oluyor ve varlık istekleri için işe yaramıyordu. Postman’s proxyTelefondan çıkan HTTP iletişimini incelemek için özelliği kullanmaya karar verdim . Ayrıntılar için resmi belgelere bakın , ancak temelde üç kolay adım vardır:

  • Postacı'da proxy'yi ayarlayın
  • Bilgisayarınızın IP adresini kontrol edin ( $ ifconfig)
  • Wifi ayarlarında mobil cihazınızda HTTP proxy'yi yapılandırın

3

Uygulamanızın yayın sürümünde ağ isteklerinde hata ayıklamak istiyorsanız, kitaplık react-native-network-logger'ı kullanabilirsiniz . Uygulama içindeki ağ isteklerini özel bir hata ayıklama ekranından izlemenizi ve görüntülemenizi sağlar.

react-native-network-logger listesi

react-native-network-logger ayrıntıları

Daha sonra bunu üretim uygulamasında kullanıcılar için devre dışı bırakmak üzere bir yapı bayrağının veya ağ bayrağının arkasına yerleştirebilirsiniz.

Sadece yükleyin ve yarn add react-native-network-loggerardından bunu uygulamanızın giriş noktasına ekleyin:

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

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

Ve bu bir hata ayıklama ekranında:

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

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

Sorumluluk reddi: Ben paket yazarıyım.


1
Dostum bu kitap harika! Teşekkürler
Emidomenge

2

Ağ isteklerinizi incelemek için Charles'ı kullanmanızı öneririm. Gerçekten iyidir ve daha fazla görünürlük sağlar ve gelişmiş şeyler yapmanıza olanak tanır.

http://charlesproxy.com


1
Charles'ı denedim ve sadece yakalamış gibi görünüyor http://localhost:8081/index.android.bundle?platform=android&dev=true.. nasıl TÜM istekleri yakalamasını sağlayacak? (Harici bir
api'ye çarpıyorum

Harici API'niz HTTPS kullanıyor mu? Eğer öyleyse, bunları da yakalamak için Charles'ı biraz yapılandırmanız gerekir.
Ran Yefet

android kullanırken, charles giden istekleri yakalamak için biraz sorunlu olabilir. charles'a erişmek için simülatörünüzü 'manuel olarak' yapılandırmanız gerekir (ve en son denediğimde, yapılandırma paneline girmek işi yapmazdı - bir komut satırı somutlamasından iletilmesi gereken proxy ip).
joe

0

Android telefonunuz veya emülatörünüz varsa

  • npx react-native start

Ardından Android Studio'yu açın .

androidbir Android Studio Project gibi projenizin klasör.

görüntü açıklamasını buraya girin

Android Profiler olan mavi simgeye tıklayın

Android Profiler başladıktan sonra, uygulamanızı SESSIONSetiketin yanındaki gri artı simgesiyle ekleyebilirsiniz.görüntü açıklamasını buraya girin

Artık bu araç aracılığıyla ağ iletişimini inceleyebilirsiniz. Ağ etkinliğinizi gösteren üçgenler görebilirsiniz.

Ağ trafiğinin incelenmesi hakkında daha fazla bilgi için lütfen bunu kontrol edin .


-26

İstek veya yanıtı görebileceğiniz js'de Hata Ayıklayıcı'yı ekleyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.