Bagaimana cara melihat permintaan jaringan (untuk debugging) di React Native?

105

Saya ingin melihat permintaan jaringan saya di React Native untuk membantu saya men-debug - idealnya di tab 'Jaringan' dari devtools Chrome.

Ada beberapa masalah tertutup tentang ini di GitHub ( https://github.com/facebook/react-native/issues/4122 dan https://github.com/facebook/react-native/issues/934 ) tetapi saya tidak ' t sepenuhnya memahami mereka. Sepertinya saya perlu membatalkan beberapa polyfill React Native dan kemudian menjalankan beberapa perintah dengan flag debugging tambahan, dan mungkin mengubah beberapa pengaturan keamanan Chrome? Dan tampaknya ada beberapa masalah keamanan yang terlibat dalam melakukan ini yang mungkin menjadikannya ide yang buruk, tetapi tidak ada yang terlibat dalam utas ini yang secara eksplisit menyatakan apa itu.

Dapatkah seseorang memberikan panduan langkah demi langkah untuk membuat tab Jaringan bekerja dengan React Native, serta penjelasan tentang masalah keamanan yang terlibat dalam melakukannya?

Mark Amery
sumber

Jawaban:

92

Saya tidak yakin mengapa tidak ada yang menunjukkan solusi ini sejauh ini. Gunakan React Native Debugger - https://github.com/jhen0409/react-native-debugger ! Ini adalah alat debugging terbaik untuk React Native menurut saya dan memberikan Inspeksi Jaringan di luar kotak.

Lihatlah tangkapan layar ini.

Klik kanan dan pilih 'Enable Network Inspect' Mengaktifkan Pemeriksaan Jaringan

Klik kanan dan pilih 'Enable Network Inspect' Mengaktifkan Pemeriksaan Jaringan

Debug pergi! Inspeksi Jaringan sedang beraksi

Kashish Grover
sumber
10
Jika Anda membaca sekilas dan melihat jawaban ini, perhatikan bahwa Anda HARUS mengklik kanan Enable Network Inspectagar berhasil. Secara default, tidak.
Stephen Saucier
1
Ini bekerja dengan baik! Akan membuat hidupku jadi lebih mudah.
Augusto Samamé Barrientos
1
Wah, kenapa fitur ini disembunyikan dengan klik kanan di panel utama. Tidak pernah tahu itu ada. Pengubah permainan. Tanggapan Json tidak muncul ... langsung muncul di toggle. Terima kasih!
Matt
2
Mengapa ini tidak diketahui lebih luas? 🤷‍♂️
Tom Mulkins
1
Lebih tepatnya mengapa ini bukan perilaku default setiap kali kita mengunjungi tab Jaringan atau tandai sebagai pengaturan (kotak centang atau semacamnya) di dalam tab itu!
CyberMew
92

Inilah yang telah saya gunakan di titik masuk aplikasi saya

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

XMLHttpRequest = _XHR

EDIT: frevib ditautkan ke sintaks yang lebih ringkas di bawah ini. Terima kasih frevib!

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

Penjelasan:

GLOBAL.originalXMLHttpRequestmerujuk salinan XHR Alat Dev Chrome. Ini disediakan oleh RN sebagai pintu keluar masuk. Solusi Shvetusya hanya akan berfungsi jika alat pengembang terbuka dan dengan demikian menyediakan XMLHttpRequest.

EDIT: Anda harus mengizinkan permintaan lintas sumber saat dalam mode debugger. Dengan chrome Anda dapat menggunakan plugin praktis ini .

EDIT: Baca tentang masalah github RN yang mengarahkan saya ke solusi ini

tryangul
sumber
4
Setelah saya memasukkan potongan kode itu, saya dapat melihat permintaan di Konsol Pengembang tetapi semua permintaan saya gagal dengan status 404. Ada yang tahu mengapa hal itu bisa terjadi?
Peter_Fretter
1
Ini bekerja. Mengambil ini dari Github
frevib
1
Ini tidak berhasil untuk saya. Saya menggunakan emulator android, dan tab jaringan menunjukkan kosong bahkan permintaan sedang dikirim
Ville Miekk-oja
19
Ini tidak berfungsi lagi, kesalahan berikut muncul di konsol (tidak yakin perubahan apa yang menyebabkan ini):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
Bekerja di pihak saya pada React Native Debugger dengan pengaturan satu baris ini. Terima kasih jutaan kali, @tryangul
Kaloyan Kosev
46

Saya menggunakan yang berikut ini di aplikasi saya (Tambahkan ini di file titik masuk app.js utama Anda):

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

Hal terbaiknya adalah ini juga menampilkan log pengambilan di konsol juga yang diformat dengan baik.

Tangkapan layar:

masukkan deskripsi gambar di sini

Di tab jaringan:

masukkan deskripsi gambar di sini

Sankalp Singha
sumber
Itu luar biasa! Terima kasih
DJ
Pada titik mana dari permintaan awal ini diaktifkan? Saya sebenarnya berpikir untuk menggunakan ini sebagai mekanisme untuk mengaktifkan token penyegaran jika respons memiliki 401. Apakah ada masalah dengan itu?
tushar747
Sankalp yang fantastis! Saya mengalami masalah dalam menjalankan Reacotron tanpa merusak pembuat Metro saya. Solusi Anda bekerja dengan baik. Bahkan bekerja di React Native Debugger.
mediaguru
Nilai header 'Access-Control-Allow-Origin' dalam respons tidak boleh berupa wildcard '*' saat mode kredensial permintaan adalah 'include'. Oleh karena itu, host asal ' localhost: 8081 ' tidak diizinkan akses. Mode kredensial permintaan yang dimulai oleh XMLHttpRequest dikontrol oleh atribut withCredentials.
Nikhil Mahirrao
Hebat. Terima kasih banyak
Markus
27

Saya menggunakan Reactotron untuk melacak permintaan jaringan.

masukkan deskripsi gambar di sini

Aung Myat Hein
sumber
3
ini sebenarnya adalah solusi terbaik dari semua jawaban di sini (untuk saya) .. sangat mudah disiapkan dan tidak memiliki semua efek samping menggunakan chrome
Blue Bot
Apa efek samping penggunaan chrome yang Anda khawatirkan? Reactotron menggunakan Kerangka Tertanam Chromium.
Kesepakatan Peter Evan
luar biasa !! terima kasih Anda menyelamatkan saya hari pencarian melalui internet
Alain
12

Saya tahu ini adalah pertanyaan lama, tetapi ada cara yang jauh lebih aman untuk melakukan ini sekarang yang tidak memerlukan penonaktifan CORS atau mengubah kode sumber React Native. Anda dapat menggunakan pustaka pihak ketiga yang disebut Reactotron yang tidak hanya melacak panggilan API (menggunakan plugin jaringan), tetapi juga dapat melacak penyimpanan Redux Anda, dan Sagas dengan penyiapan tambahan:

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

Jeb
sumber
Reactotron sepertinya berfungsi hanya jika Anda menggunakan perpustakaan eksternal yang disebut apisauce. Ini tidak berfungsi untuk pengambilan normal. Jadi jika Anda ingin memantau permintaan yang dikirim oleh perpustakaan eksternal di aplikasi Anda, reactotron tidak bagus.
Ville Miekk-oja
1
@ VilleMiekk-oja sebenarnya reactotron mendukung Networking with Fetch sejak Maret, hanya saja dokumentasinya sudah ketinggalan zaman. Saya mencobanya sendiri, dan memperbaikinya di readme :)
Juan Carlos Alpizar Chinchilla
ini bekerja dengan sangat baik; Saya telah melihat begitu banyak masalah dengan: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad
1
reactotron sangat mudah dikonfigurasi dan berguna untuk melacak panggilan jaringan dari aplikasi react-native
Ram
9

Saya dapat men-debug permintaan saya di Chrome dengan menghapus polyfill yang disediakan React Native setelah mengimpor React Native.

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

Ini berhasil untuk saya untuk permintaan asal yang sama. Tidak yakin apakah Anda perlu menonaktifkan CORS di Chrome untuk membuatnya berfungsi untuk lintas sumber.

lanan
sumber
Apa itu permintaan "asal yang sama", dalam konteks permintaan yang dibuat dari aplikasi React Native? Yang ada di domain yang sama dengan debugger (misalnya, mungkin localhost)?
Mark Amery
untuk kasus saya, Anda harus menonaktifkan CORS di Chrome agar berfungsi untuk lintas sumber. periksa plugin chrome ini: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul
@MouhamedHalloul dapatkah Anda menjelaskan bagaimana Anda menggunakan plugin ini?
alexmngn
@alexmngn hai, cukup instal plugin dan hidupkan bu menggeser tombol, ikon harus hijau saat aktif dan merah saat mati itu saja. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul
5

Di masa lalu saya menggunakan GLOBAL.XMLHttpRequestretas untuk melacak permintaan API saya, tetapi terkadang sangat lambat dan tidak berfungsi untuk permintaan aset. Saya memutuskan untuk menggunakan Postman’s proxyfitur untuk memeriksa komunikasi HTTP keluar dari telepon. Untuk detailnya lihat dokumentasi resminya , tetapi pada dasarnya, ada tiga langkah mudah:

  • Siapkan proxy di Postman
  • Periksa alamat IP komputer Anda ( $ ifconfig)
  • Konfigurasikan proxy HTTP di perangkat seluler Anda dalam pengaturan wifi
mradziwon
sumber
5

Harap berhati-hati dengan kode ini.

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

Ini membantu dan bagus, tetapi merusak unggahan. Saya menghabiskan 2 hari mencoba untuk mencari tahu mengapa file yang diunggah mengirim [Objek Objek] daripada file yang sebenarnya. Alasannya adalah kode di atas.

Gunakan ini untuk panggilan biasa tidak tetapi untuk panggilan data multi bagian / formulir

Dawid Dereszewski
sumber
2

Saya sarankan menggunakan Charles untuk memeriksa permintaan jaringan Anda. Ini sangat bagus dan memberikan lebih banyak visibilitas dan memungkinkan Anda melakukan hal-hal tingkat lanjut.

http://charlesproxy.com

Ran Yefet
sumber
1
Baru saja mencoba Charles dan sepertinya hanya menangkap http://localhost:8081/index.android.bundle?platform=android&dev=true.. bagaimana membuatnya menangkap SEMUA permintaan? (Saya menekan api eksternal)
jakeforaker
Apakah API eksternal Anda menggunakan HTTPS? Jika demikian, Anda perlu mengkonfigurasi Charles sedikit untuk menangkapnya juga.
Ran Yefet
saat menggunakan android, charles bisa menjadi sedikit bermasalah untuk menangkap permintaan keluar. Anda perlu 'secara manual' mengkonfigurasi simulator Anda untuk mengakses charles (dan terakhir kali saya mencoba, masuk ke panel config tidak akan melakukan pekerjaan itu - ip proxy perlu diteruskan dari perintah baris).
joe
2

Jika Anda ingin men-debug permintaan jaringan pada versi rilis aplikasi Anda, Anda dapat menggunakan library react-native-network-logger . Ini memungkinkan Anda memantau dan melihat permintaan jaringan dalam aplikasi dari layar debug khusus.

daftar react-native-network-logger

detail react-native-network-logger

Anda kemudian dapat meletakkan ini di belakang bendera build atau bendera jaringan untuk menonaktifkannya bagi pengguna di aplikasi produksi.

Instal saja dengan yarn add react-native-network-loggerlalu tambahkan ini di titik masuk aplikasi Anda:

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

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

Dan ini di layar debug:

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

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

Penafian: Saya pembuat paket.

braza
sumber
Bung, lib ini luar biasa! Terima kasih
Emidomenge
0

Jika Anda memiliki ponsel atau emulator android,

  • npx react-native start

Kemudian buka Android Studio .

Buka androidfolder proyek Anda sebagai Proyek Android Studio.

masukkan deskripsi gambar di sini

Klik ikon biru itu yang merupakan Android Profiler

Setelah Android Profiler dimulai, Anda dapat menambahkan aplikasi Anda melalui ikon plus abu-abu di dekat SESSIONSlabel masukkan deskripsi gambar di sini

Sekarang Anda dapat memeriksa jaringan melalui alat ini. Anda dapat melihat segitiga yang menunjukkan aktivitas jaringan Anda.

Silakan periksa ini untuk info lebih lanjut tentang memeriksa lalu lintas jaringan .

Muhammed Ozdogan
sumber
-26

Tambahkan Debugger di js tempat Anda dapat melihat req atau respons

Pramod Mg
sumber