Як я можу переглядати мережеві запити (для налагодження) у React Native?


102

Я хотів би переглянути свої мережеві запити в React Native, щоб допомогти мені у налагодженні - в ідеалі на вкладці "Мережа" в програмах розробки Chrome.

На GitHub є кілька закритих питань щодо цього ( https://github.com/facebook/react-native/issues/4122 та https://github.com/facebook/react-native/issues/934 ), але я не я їх цілком розумію. Здається, мені потрібно скасувати деякі полізаповнення React Native, а потім виконати деякі команди з додатковими прапорцями налагодження та, можливо, змінити деякі налаштування безпеки Chrome? І, мабуть, у цьому пов'язані деякі проблеми безпеки, які можуть зробити це жахливою ідеєю, але ніхто, хто бере участь у цій темі, прямо не заявив, що це таке.

Чи може хтось надати покроковий посібник із налаштування вкладки Мережа, що працює з React Native, а також пояснення проблем безпеки, пов’язаних із цим?

Відповіді:


91

Це те, що я використовував у точці входу мого додатка

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

XMLHttpRequest = _XHR

EDIT: frevib пов'язаний із більш стислим синтаксисом нижче. Дякую frevib!

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

Пояснення:

GLOBAL.originalXMLHttpRequestпосилається на копію XHR Chrome Dev Tools. Він надається RN як евакуаційний люк. Рішення Shvetusya працюватиме лише в тому випадку, якщо інструменти розробника відкриті і, таким чином, забезпечують XMLHttpRequest.

РЕДАГУВАТИ: Вам потрібно буде дозволити запити на перехресне походження, коли ви знаходитесь у режимі налагодження. З chrome ви можете використовувати цей зручний плагін .

EDIT: Прочитайте про випуск RN github, який привів мене до цього рішення


4
Після того, як я помістив цей шматок коду, я можу побачити запит у консолі розробника, але весь мій запит зазнав невдачі зі статусом 404. Хтось уявляє, чому це може статися?
Peter_Fretter

1
Це працює. Взяв це у Github
frevib

1
Це не працює для мене. Я використовую емулятор android, а на вкладці мережі видно, що навіть надсилаються порожні запити
Ville Miekk-oja

19
Це більше не працює, у консолі з’являється така помилка (не впевнений, які зміни спричинили це):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)
Максим Зубарев

1
Працює з моєї сторони на React Native Debugger за допомогою цієї однокласної установки. Мільйон разів дякую, @tryangul
Калоян

88

Я не впевнений, чому досі ніхто не вказував на це рішення. Використовуйте власний налагоджувач React - https://github.com/jhen0409/react-native-debugger ! На мою думку, це найкращий налагоджувальний інструмент для React Native, і він надає мережеву перевірку нестандартно.

Погляньте на ці скріншоти.

Клацніть правою кнопкою миші та виберіть "Увімкнути перевірку мережі" Увімкнення перевірки мережі

Клацніть правою кнопкою миші та виберіть "Увімкнути перевірку мережі" Увімкнення перевірки мережі

Налагодження геть! Мережа перевіряє в дії


10
Якщо ви виконуєте скімнінг і бачите цю відповідь, зауважте, що ПОВИНЕН клацнути правою кнопкою миші, і Enable Network Inspectвона буде працювати. За замовчуванням це не так.
Стівен

1
Це чудово працює! Це значно полегшить моє життя.
Аугусто Самаме Баррієнтос

1
Ого, чому ця функція прихована правою кнопкою миші на головній панелі. Ніколи не знав, що це існує. Ігровий чейнджер. Відповіді Json не відображалися ... з’являйся відразу на перемикачі. Дякую!
Метт

2
Чому це не широко відомо? 🤷‍♂️
Том Малкінс,

1
Більш схоже на те, чому це не є типовою поведінкою кожного разу, коли ми відвідуємо вкладку Мережа або позначаємо як параметр (прапорець або деякі сорти) всередині цієї вкладки!
CyberMew

46

У своєму додатку я використовую наступне (додайте це у своєму головному файлі точки входу 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;
  });
};

Найкраще те, що він також відображає журнали отримання в консолі, а також добре відформатовані.

Знімок екрана:

введіть тут опис зображення

На вкладці мережі:

введіть тут опис зображення


Це круто! Дякую
DJ Forth

У який момент початкового запиту це спрацьовує? Я насправді думаю використовувати це як механізм для запуску токенів оновлення, якщо у відповіді є 401. Чи є з цим проблема?
tushar747

ФАНТАСТИЧНИЙ Sankalp! У мене були проблеми з тим, щоб Reacotron працював, не збиваючи свій конструктор метро. Ваше рішення чудово працює. Навіть працює в React Native Debugger.
медіагуру

Значення заголовка 'Access-Control-Allow-Origin' у відповіді не повинно бути символом підстановки '*', коли режим облікових даних запиту має значення "включати". Тому походження ' localhost: 8081 ' заборонено. Режим облікових даних запитів, ініційованих XMLHttpRequest, контролюється атрибутом withCredentials.
Nikhil Mahirrao

Дивовижно. Щиро дякую
Марк

27

Я використовую Reactotron для відстеження мережевих запитів.

введіть тут опис зображення


3
це насправді найкраще рішення з усіх відповідей тут (для мене) .. надзвичайно просто налаштувати і не мати всіх побічних ефектів від використання хрому
Blue Bot

Які побічні ефекти використання хрому ви турбуєте? Reactotron використовує Chromium Embedded Framework.
угода Пітера Евана

дивовижно !! спасибі, що ти врятував мені дні пошуку в мережі
Ален

12

Я знаю, що це старе запитання, але зараз є набагато безпечніший спосіб зробити це, який не вимагає відключення CORS або зміни вихідного коду React Native. Ви можете використовувати сторонню бібліотеку під назвою Reactotron, яка не тільки відстежує виклики API (за допомогою мережевого плагіна), але також може відстежувати ваш магазин Redux та Sagas з додатковим налаштуванням:

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


Здавалося, реактотрон працює лише в тому випадку, якщо ви використовуєте зовнішню бібліотеку, яка називається apisauce. Це не працює для звичайного отримання. Отже, якщо ви хочете відстежувати запити, надіслані зовнішніми бібліотеками у вашому додатку, реактотрон не годиться.
Ville Miekk-oja

1
@ VilleMiekk-oja фактично Reactotron підтримує мережу з Fetch з березня, це просто документація застаріла. Я спробував сам і виправив у readme :)
Хуан Карлос Альпізар Шиншила

це працює чудово; Я бачив стільки проблем із: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Петрогад,

1
Реактотрон дійсно простий у налаштуванні та корисний для відстеження мережевих дзвінків реактивних додатків
Рам,

9

Я зміг налагодити мої запити в Chrome, видаливши polyfill, який React Native надає після імпорту React Native.

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

Це працювало у мене для запитів того самого походження. Не впевнений, чи потрібно вимикати CORS у Chrome, щоб він працював для перехресного походження.


Що таке запит "того самого походження" в контексті запитів, зроблених із програми React Native? Той, що знаходиться в тому ж домені, що і налагоджувач (тобто, можливо, localhost)?
Mark Amery

в моєму випадку вам потрібно вимкнути CORS у Chrome, щоб він працював для перехресного походження. перевірте цей плагін chrome: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Мухаммед Халлул,

@MouhamedHalloul, ти можеш пояснити, як ти використовував цей плагін?
alexmngn

@alexmngn привіт, просто встановіть плагін і увімкніть його, натиснувши кнопку, піктограма повинна бути зеленою, коли вона увімкнена, і червоною, коли вона вимкнена, ось і все. dropbox.com/s/242fflwgcew6m50/…
Мухамед Халлул,

5

Раніше я використовував GLOBAL.XMLHttpRequestхак для відстеження своїх запитів API, але іноді це дуже повільно і не працює для запитів на активи. Я вирішив використати Postman’s proxyфункцію для перевірки зв'язку HTTP, що виходить із телефону. Детальніше див. В офіційній документації , але в основному є три простих кроки:

  • Налаштуйте проксі-сервер у поштарці
  • Перевірте IP-адресу комп’ютера ( $ ifconfig)
  • Налаштуйте HTTP-проксі на своєму мобільному пристрої в налаштуваннях Wi-Fi

5

Будьте обережні з цим кодом.

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

Це допомагає, і це чудово, але руйнує завантаження. Я витрачаю 2 дні, намагаючись зрозуміти, чому завантажені файли надсилають [object Object] замість реального файлу. Причиною є код вище.

Використовуйте його для звичайних дзвінків, а не для дзвінків із кількома частинами та з використанням даних


2

Я пропоную використовувати Чарльза для перевірки ваших мережевих запитів. Це дійсно добре, забезпечує більшу видимість і дозволяє робити просунуті речі.

http://charlesproxy.com


1
Щойно спробував Чарльз, і, схоже, він лише захоплює http://localhost:8081/index.android.bundle?platform=android&dev=true.. як зробити так, щоб він захоплював ВСІ запити? (Я потрапляю на зовнішній API)
jakeforaker

Ваш зовнішній API використовує HTTPS? Якщо так, то вам потрібно трохи налаштувати Чарльза, щоб він також ловив їх.
Ран Єфет

під час використання Android, Чарльз може бути трохи проблематичним для захоплення вихідних запитів. вам потрібно налаштувати симулятор вручну для доступу до charles (і востаннє, коли я намагався, перехід на панель конфігурації не зробив би роботи - ip проксі-сервера потрібно було передати з екземпляра командного рядка).
Джо

1

Якщо ви хочете налагодити мережеві запити у випускній версії вашого додатка, ви можете скористатися бібліотекою response-native-network-logger . Це дозволяє вам відстежувати та переглядати мережеві запити в додатку з екрана налагодженого користувача.

список-реєстратор-рідна-мережа

подробиці реєстратора-рідної-мережі

Потім ви можете поставити це за прапором побудови або мережевим прапором, щоб вимкнути його для користувачів у робочій програмі.

Просто встановіть його за допомогою, yarn add react-native-network-loggerа потім додайте це у пункті входу вашого додатка:

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

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

І це на екрані налагодження:

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

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

Застереження: Я автор пакета.


Чувак, ця бібліотека чудова! Дякую
Emidomenge

0

Якщо у вас телефон Android або емулятор,

  • npx react-native start

Потім відкрийте Android Studio .

Відкрийте androidпапку свого проекту як проект Android Studio.

введіть тут опис зображення

Клацніть на синю піктограму Android Profiler

Після запуску програми Android Profiler ви можете додати свою програму за допомогою сірого значка плюс біля SESSIONSярлика введіть тут опис зображення

Тепер ви можете перевірити мережу за допомогою цього інструменту. Ви можете побачити трикутники, які відображають вашу мережеву активність.

Будь ласка, перевірте це для отримання додаткової інформації про перевірку мережевого трафіку .


-25

Додайте налагоджувач у js, де ви зможете побачити запит чи відповідь

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.