Как я могу просматривать сетевые запросы (для отладки) в React Native?

105

Я хотел бы просматривать свои сетевые запросы в 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, а также объяснение связанных с этим проблем безопасности?

Марк Эмери
источник

Ответы:

94

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

Взгляните на эти скриншоты.

Щелкните правой кнопкой мыши и выберите «Включить проверку сети». Включение проверки сети

Щелкните правой кнопкой мыши и выберите «Включить проверку сети». Включение проверки сети

Отладка прочь! Network Inspect в действии

Кашиш Гровер
источник
10
Если вы просматриваете этот ответ, обратите внимание, что вы ДОЛЖНЫ щелкнуть правой кнопкой мыши, Enable Network Inspectчтобы он заработал. По умолчанию это не так.
Стивен
1
Это прекрасно работает! Сделаю мою жизнь намного проще.
Аугусто Самаме Барриентос
1
Вау, почему эта функция скрыта щелчком правой кнопки мыши на главной панели. Никогда не знал, что такое существует. Смена правил игры. Ответы Json не отображались ... сразу появляются при переключении. Спасибо!
Мэтт
2
Почему это не так широко известно? 🤷‍♂️
Том Малкинс
1
Скорее, почему это не поведение по умолчанию, когда мы посещаем вкладку «Сеть» или отмечаем ее как параметр (флажок или какие-то виды) внутри этой вкладки!
CyberMew
92

Это то, что я использовал в точке входа в свое приложение

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. Предусмотрен РН как аварийный люк. Решение Шветуся будет работать, только если инструменты разработчика открыты и, следовательно, предоставляют XMLHttpRequest.

РЕДАКТИРОВАТЬ: вам нужно будет разрешить запросы перекрестного происхождения в режиме отладчика. С хромом вы можете использовать этот удобный плагин .

РЕДАКТИРОВАТЬ: прочитайте о проблеме с RN github, которая привела меня к этому решению

Трянгуль
источник
4
После того, как я поместил этот фрагмент кода, я могу увидеть запрос в консоли разработчика, но все мои запросы не выполняются со статусом 404. Кто-нибудь знает, почему это могло произойти?
Peter_Fretter
1
Это работает.
Взято
1
У меня это не работает. Я использую эмулятор Android, и на вкладке сети отображаются пустые, даже если запросы отправляются
Вилле Микк-
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
Калоян Косев
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
ФАНТАСТИЧЕСКИЙ Санкальп! У меня были проблемы с тем, чтобы Reacotron работал без сбоя моего Metro Builder. Ваше решение отлично работает. Работает даже в React Native Debugger.
mediaguru
Значение заголовка «Access-Control-Allow-Origin» в ответе не должно быть подстановочным знаком «*», если режим учетных данных запроса - «включить». Происхождение « локальный: 8081 », следовательно , не имеет права доступа. Режим учетных данных запросов, инициированных XMLHttpRequest, управляется атрибутом withCredentials.
Nikhil Mahirrao
Потрясающие. Большое вам спасибо
Марк
28

Я использую 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

Джеб
источник
Reactotron работал, только если вы использовали внешнюю библиотеку apisauce. Это не работает для нормальной выборки. Поэтому, если вы хотите отслеживать запросы, отправленные внешними библиотеками в своем приложении, reactotron не подходит.
Ville Miekk-oja
1
@ VilleMiekk-oja на самом деле reactotron поддерживает Networking with Fetch с марта, просто документация устарела. Я сам попробовал, и поправил в ридми :)
Хуан Карлос Альписар Шинчилла
это отлично работает; Я видел так много проблем с: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Петрогад
1
reactotron действительно прост в настройке и полезен для отслеживания сетевых вызовов приложений, поддерживающих реакцию,
Ram
9

Мне удалось отладить свои запросы в Chrome, удалив полифил, который React Native предоставляет после импорта React Native.

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

Это сработало для меня для запросов о том же происхождении. Не уверен, нужно ли вам отключить CORS в Chrome, чтобы он работал для перекрестного происхождения.

ланан
источник
Что такое запрос «того же происхождения» в контексте запросов, сделанных из приложения React Native? Тот, который находится в том же домене, что и отладчик (то есть, вероятно, localhost)?
Марк Эмери
в моем случае вам нужно отключить 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-соединения, исходящего с телефона. Подробности смотрите в официальной документации , но в основном это три простых шага:

  • Настроить прокси в Postman
  • Проверьте IP-адрес вашего компьютера ( $ ifconfig)
  • Настройте HTTP-прокси на мобильном устройстве в настройках Wi-Fi
Мрадзивон
источник
5

Будьте осторожны с этим кодом.

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

Это помогает и здорово, но портит загрузку. Я потратил 2 дня, пытаясь понять, почему загруженные файлы отправляют [объект Object] вместо реального файла. Причина в приведенном выше коде.

Используйте его не для обычных вызовов, а для вызовов multipart / form-data

Давид Дерешевски
источник
2

Я предлагаю использовать Charles для проверки ваших сетевых запросов. Это действительно хорошо, обеспечивает большую наглядность и позволяет делать сложные вещи.

http://charlesproxy.com

Ран Ефет
источник
1
Только что попробовал Чарльз, и он, кажется, только захватывает http://localhost:8081/index.android.bundle?platform=android&dev=true.. как заставить его захватывать ВСЕ запросы? (Я
нажимаю
Ваш внешний API использует HTTPS? Если это так, вам нужно немного настроить Charles, чтобы их также можно было поймать.
Ран Ефет
при использовании android может быть немного проблематично перехватить исходящие запросы charles. вам нужно «вручную» настроить свой симулятор для доступа к charles (и в последний раз, когда я пытался, переход в панель конфигурации не выполнял свою работу - прокси-IP должен был быть передан из экземпляра командной строки).
Джо
2

Если вы хотите отлаживать сетевые запросы в окончательной версии своего приложения, вы можете использовать библиотеку response-native-network-logger . Он позволяет отслеживать и просматривать сетевые запросы в приложении на настраиваемом экране отладки.

список реагировать-native-network-logger

React-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 />;

Отказ от ответственности: я автор пакета.

Braza
источник
Чувак, эта библиотека потрясающая! Спасибо
Эмидомендж
0

Если у вас есть телефон или эмулятор Android,

  • npx react-native start

Затем откройте Android Studio .

Откройте androidпапку вашего проекта как проект Android Studio.

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

Щелкните этот синий значок, это Android Profiler.

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

Теперь вы можете проверить сеть с помощью этого инструмента. Вы можете видеть треугольники, которые показывают вашу сетевую активность.

Пожалуйста, проверьте это для получения дополнительной информации о проверке сетевого трафика .

Мухаммед Оздоган
источник
-26

Добавьте отладчик в js, где вы можете увидеть запрос или ответ

Прамод Мг
источник