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

編集:以下のより簡潔な構文にリンクされているフレビブ。ありがとうフレビブ!

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

説明:

GLOBAL.originalXMLHttpRequestXHRのChrome Dev Toolsコピーを指します。エスケープハッチとしてRNから提供されます。Shvetusyaのソリューションは、開発ツールが開いている場合にのみ機能しXMLHttpRequestます。

編集:デバッガーモードでは、クロスオリジンリクエストを許可する必要があります。クロムを使用すると、この便利なプラグインを使用できます

編集:私をこのソリューションに導いたRN githubの問題について読んでください


4
そのコードを挿入した後、開発者コンソールで要求を確認できますが、すべての要求が404ステータスで失敗します。誰もがなぜそれが起こるのか考えていますか?
Peter_Fretter 2017年

1
これは機能します。Github
取得

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)
マキシムZubarev

1
この1行のセットアップで、React Native Debuggerの私の側で動作します。100万回ありがとう、@ tryangul
Kaloyan Kosev

87

なぜ今まで誰もこの解決策を指摘しなかったのかわかりません。React Native Debuggerを使用する-https ://github.com/jhen0409/react-native-debugger!私の意見では、これはReact Nativeに最適なデバッグツールであり、ネットワーク検査をすぐに使用できます。

これらのスクリーンショットを見てください。

右クリックして[ネットワーク検査を有効にする]を選択します ネットワーク検査を有効にする

右クリックして[ネットワーク検査を有効にする]を選択します ネットワーク検査を有効にする

デバッグしてください! 動作中のネットワーク検査


10
スキミングしてこの回答が表示された場合は、右クリックしEnable Network Inspectて機能させる必要があることに注意してください。デフォルトでは、そうではありません。
Stephen Saucier

1
これはうまくいきます!私の人生をとても簡単にします。
AugustoSamaméBarrientos

1
うわー、なぜこの機能はメインパネルの右クリックで非表示になるのですか。それが存在することを知らなかった。ゲームチェンジャー。Jsonの応答が表示されませんでした...トグルですぐに表示されます。ありがとう!
マット

2
なぜこれはもっと広く知られていないのですか?🤷‍♂️
トムマルキンス

1
[ネットワーク]タブにアクセスしたり、そのタブ内の設定(チェックボックスなど)としてマークしたりするたびに、これがデフォルトの動作にならないのはなぜですか。
Cyber​​Mew

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フォース2018年

これは最初のリクエストのどの時点で発生しますか?これを実際に使用して、応答に401がある場合にリフレッシュトークンを起動するメカニズムを考えています。問題はありますか?
tushar747

幻想的なサンカルプ!MetroビルダーをクラッシュさせずにReacotronを動作させるのに苦労しました。あなたのソリューションは素晴らしい働きをします。React Native Debuggerでも機能します。
mediaguru

リクエストの認証情報モードが「include」の場合、レスポンスの「Access-Control-Allow-Origin」ヘッダーの値はワイルドカード「*」であってはなりません。したがって、オリジン ' localhost:8081 'はアクセスを許可されていません。XMLHttpRequestによって開始された要求の資格情報モードは、withCredentials属性によって制御されます。
Nikhil Mahirrao

驚くばかり。どうもありがとうございました
Mark

27

私はネットワークリクエストの追跡にReactotronを使用しています。

ここに画像の説明を入力してください


3
これは実際に...超簡単セットアップするとクロムを使用して、すべての副作用を持っていない(私にとっては)ここにすべての答えのうち最適なソリューションです
ブルーボット

あなたが心配しているクロムを使用することの副作用は何ですか?ReactotronはChromium Embedded Frameworkを使用しています。
Peter Evan Deal

驚くばかり !!おかげで、ネット上の検索の日数を節約できました
アラン

12

これは古い質問であることはわかっていますが、CORSを無効にしたり、React Nativeソースコードを変更したりする必要のない、今より安全な方法があります。(ネットワークプラグインを使用して)API呼び出しを追跡するだけでなく、追加の設定でReduxストアとSagasを追跡できるReactotronと呼ばれるサードパーティライブラリを使用できます。

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


Reactotronは、apisauceという外部ライブラリーを使用した場合にのみ機能するように見えました。通常のフェッチでは機能しません。したがって、アプリの外部ライブラリから送信されたリクエストを監視する場合、reactotronは役に立ちません。
Ville Miekk-oja 2017

1
@ VilleMiekk-oja実際、reactotronは3月からFetchを使用したネットワーキングをサポートしています。これはドキュメントが古くなっているだけです。私は自分で試して、readmeで修正しました:)
Juan Carlos Alpizar Chinchilla

これは素晴らしい働きをします。GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest ||で次のような多くの問題を見てきました。GLOBAL.XMLHttpRequest;
ペトロガド2018年

1
reactotronは非常に簡単に構成でき、react-nativeアプリケーションのネットワーク呼び出しを追跡するのに便利です
Ram

9

React Nativeをインポートした後、React Nativeが提供するポリフィルを削除することで、Chromeでリクエストをデバッグできました。

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

これは、同じオリジンリクエストに対して私にとってはうまくいきました。クロスオリジンで機能させるためにChromeでCORSを無効にする必要があるかどうかはわかりません。


React Nativeアプリからのリクエストに関して、「同じオリジン」リクエストとは何ですか?デバッガーと同じドメインにあるもの(つまり、おそらくlocalhost)?
Mark Amery

私の場合、クロスオリジンで機能させるには、ChromeでCORSを無効にする必要があります。:このクロームプラグインチェックchrome.google.com/webstore/detail/allow-control-allow-origi/...
Mouhamed Halloul

@MouhamedHalloulこのプラグインをどのように使用したのですか?
alexmngn 2016年

@alexmngnねえ、プラグインをインストールしてボタンをスライドさせてオンにするだけです。アイコンがオンのときは緑色になり、オフのときは赤色になります。dropbox.com/s/242fflwgcew6m50/...
Mouhamed Halloul

5

以前は、GLOBAL.XMLHttpRequestハックを使用してAPIリクエストを追跡していましたが、非常に遅く、アセットリクエストに対して機能しない場合がありました。Postman’s proxy機能を使用して、電話から発信されるHTTP通信を検査することにしました。詳細については公式ドキュメントをご覧ください。ただし、基本的には3つの簡単な手順があります。

  • Postmanでプロキシを設定する
  • コンピュータのIPアドレスを確認してください($ ifconfig
  • Wi-Fi設定でモバイルデバイスのHTTPプロキシを構成する

5

このコードには注意してください。

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

それは役立ち、それは素晴らしいですが、アップロードを破壊します。アップロードされたファイルが実際のファイルではなく[オブジェクトオブジェクト]を送信する理由を解明するために2日間費やしています。理由は上のコードです。

通常の呼び出しではなくマルチパート/フォームデータの呼び出しに使用します


2

Charlesを使用してネットワークリクエストを検査することをお勧めします。それは本当に良いですし、より多くの可視性を提供し、高度なことを行うことができます。

http://charlesproxy.com


1
チャールズを試したところ、http://localhost:8081/index.android.bundle?platform=android&dev=trueすべてのリクエストのみがキャプチャされるように見えます。(外部APIを使用しています)
jakeforaker

外部APIはHTTPSを使用していますか?その場合、Charlesを少し設定して、それらも同様にキャッチする必要があります。
Ran Yefet 2016年

androidを使用している場合、charlesは送信リクエストをキャプチャするのに少し問題があります。チャールにアクセスするようにシミュレーターを「手動で」構成する必要があります(そして、私が最後に試したとき、構成パネルにアクセスしても機能しません-コマンドラインのインスタンス化からプロキシIPを渡す必要がありました)。
joe

1

アプリのリリースバージョンでネットワークリクエストをデバッグする場合は、ライブラリ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 />;

免責事項:私はパッケージの作者です。


このlibは素晴らしいです!ありがとう
Emidomenge

0

Androidフォンまたはエミュレータをお持ちの場合、

  • npx react-native start

次にAndroid Studioを開きます。

androidAndroid Studioプロジェクトとしてプロジェクトのフォルダーを開きます。

ここに画像の説明を入力してください

Androidプロファイラーである青いアイコンをクリックします

Androidプロファイラの起動後、SESSIONSラベルの 近くの灰色のプラスアイコンを介してアプリを追加できますここに画像の説明を入力してください

これで、このツールを使用してネットワークを検査できます。ネットワークアクティビティを示す三角形が表示されます。

ネットワークトラフィックの検査について詳しくは、こちらをご覧ください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.