如何在React Native中查看网络请求(用于调试)?


105

我想在React Native中查看我的网络请求以帮助我进行调试-最好在Chrome devtool的“网络”标签中。

在GitHub(https://github.com/facebook/react-native/issues/4122https://github.com/facebook/react-native/issues/934)上有一些封闭的问题,但我没有不能完全理解它们。听起来我需要撤消一些React Native的polyfill,然后运行带有额外调试标志的某些命令,也许还要修改某些Chrome安全设置?显然,这样做涉及到一些安全问题,这可能使它成为一个可怕的主意,但是线程中没有人明确声明它们的含义。

有人可以提供逐步指南以使“网络”选项卡与React Native一起使用,以及对这样做所涉及的安全性问题的解释吗?

Answers:


92

我不确定为什么到目前为止没有人指出这种解决方案。使用React Native Debugger- https://github.com/jhen0409/react-native-debugger!我认为这是React Native的最佳调试工具,并且开箱即可进行网络检查。

看一下这些屏幕截图。

右键单击并选择“启用网络检查” 启用网络检查

右键单击并选择“启用网络检查” 启用网络检查

调试一下! 进行网络检查


10
如果您正在浏览并看到此答案,请注意您必须右键单击并Enable Network Inspect使其正常工作。默认情况下没有。
Stephen Saucier

1
这很棒!将使我的生活变得如此轻松。
奥古斯托·萨玛(AugustoSamaméBarrientos),

1
哇,为什么右键单击主面板隐藏了此功能。从来不知道存在。改变游戏规则的人。Json的响应没有显示出来……在切换时立即显示出来。谢谢!
马特

2
为什么这不是更广为人知的?♂‍♂️
Tom Mulkins

1
更像是为什么我们每次访问“网络”选项卡或将该选项卡标记为设置(复选框或某种形式)时,这都不是默认行为!
Cyber​​Mew

92

这就是我在应用程序入口处一直使用的

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

XMLHttpRequest = _XHR

编辑:frevib链接到下面更简洁的语法。谢谢frevib!

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

说明:

GLOBAL.originalXMLHttpRequest是指XHR的Chrome开发工具副本。由RN提供,作为逃生舱口。Shvetusya的解决方案仅在开发工具处于打开状态并因此提供XMLHttpRequest

编辑:在调试器模式下,您将需要允许跨源请求。使用chrome,您可以使用此便捷的插件

编辑:了解导致我到此解决方案的RN github问题


4
输入该段代码后,我可以在开发人员控制台中看到该请求,但是我的所有请求均以404状态失败。任何人都知道为什么会发生这种情况吗?
Peter_Fretter

1

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)
Maxim Zubarev

1
通过这种单线设置,可以在React Native Debugger上与我合作。感谢百万次,@tryangul
Kaloyan Kosev '19年

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正常工作而不会使Metro建造器崩溃。您的解决方案效果很好。甚至可以在React Native Debugger中使用。
mediaguru

当请求的凭据模式为“ include”时,响应中“ Access-Control-Allow-Origin”标头的值不得为通配符“ *”。因此,不允许访问源' localhost:8081 '。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。
Nikhil Mahirrao

太棒了 非常感谢
Mark

27

我使用Reactotron跟踪网络请求。

在此处输入图片说明


3
这实际上是这里所有答案中最好的解决方案(对我来说)..超级易于设置并且没有使用铬的所有副作用
Blue Bot

您担心使用铬的副作用是什么?Reactotron使用Chromium嵌入式框架。
彼得·埃文

太棒了!! 谢谢您为我节省了网上搜索的时间
Alain

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的外部库时,Reactotron才起作用。它不适用于正常提取。因此,如果您想监视应用程序中外部库发送的请求,reactotron不好。
Ville Miekk-oja'8

1
实际上,@ VilleMiekk-oja自3月以来,reactotron就支持Fetch与Networking,只是文档已过时。我自己尝试过,并在自述文件中进行了纠正:)
Juan Carlos Alpizar Chinchilla

这很好 我看到了很多问题:GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad18年

1
reactotron真的很容易配置,并且对跟踪本地应用程序的网络调用很有用
Ram

9

导入React Native之后,我可以通过删除React Native提供的polyfill来调试Chrome中的请求。

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

这对我来说适用于相同来源的请求。不知道是否需要在Chrome中禁用CORS才能使其适用于跨源。


在从React Native应用程序发出的请求的上下文中,什么是“相同来源”请求?与调试器位于同一域的主机(即可能是本地主机)?
Mark Amery 2015年

就我而言,您必须在Chrome中禁用CORS才能使其适用于跨来源。检查以下chrome插件:chrome.google.com/webstore/detail/allow-control-allow-origi/…
穆哈迈德Halloul

@MouhamedHalloul您能解释一下您如何使用此插件吗?
alexmngn

@alexmngn嘿,只需安装插件并通过滑动按钮将其打开,图标打开时应为绿色,关闭时应为红色。dropbox.com/s/242fflwgcew6m50/...
穆哈迈德Halloul

5

过去,我使用GLOBAL.XMLHttpRequest骇客来追踪我的API请求,但有时速度非常慢,无法用于资产请求。我决定使用Postman’s proxy功能来检查从电话发出的HTTP通信。有关详细信息,请参阅官方文档,但是基本上可以通过三个简单步骤:

  • 在邮递员中设置代理
  • 检查您计算机的IP地址($ ifconfig
  • 在wifi设置中配置移动设备上的HTTP代理

5

请谨慎使用此代码。

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

它很有帮助,效果很好,但会破坏上传。我花了2天的时间来弄清楚为什么上传的文件发送的是[object Object]而不是实际文件。原因是上面的代码。

不能将其用于常规调用,而可以用于多部分/表单数据调用


2

我建议使用Charles检查您的网络请求。它非常好,可以提供更多的可见性,并允许您执行高级操作。

http://charlesproxy.com


1
刚刚尝试查尔斯,它似乎只捕获http://localhost:8081/index.android.bundle?platform=android&dev=true..如何使其捕获所有请求?(我正在使用外部api)
jakeforaker

您的外部API是否使用HTTPS?如果是这样的话,您还需要对Charles进行一些配置以使其同时被抓住。
Ran Yefet'1

使用android时,查尔斯在捕获传出的请求时可能会有些问题。您需要“手动”配置模拟器以访问查尔斯(而我上次尝试时,进入配置面板将无法完成任务-代理ip需要从命令行实例传递进来)。

2

如果您希望在应用的发行版上调试网络请求,则可以使用库react-native-network-logger。它使您可以从自定义调试屏幕监视和查看应用程序内的网络请求。

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

免责声明:我是程序包的作者。


老兄,这个库真棒!谢谢
Emidomenge

0

如果您有Android手机或模拟器,

  • npx react-native start

然后打开Android Studio

android将项目的文件夹作为Android Studio项目打开。

在此处输入图片说明

单击蓝色图标,它是Android Profiler

Android Profiler启动后,您可以通过SESSIONS标签 旁边的灰色加号图标添加应用在此处输入图片说明

现在,您可以通过此工具检查网络。您可以看到显示网络活动的三角形。

请检查有关检查网络流量的更多信息。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.