Làm cách nào để xem các yêu cầu mạng (để gỡ lỗi) trong React Native?


102

Tôi muốn xem các yêu cầu mạng của mình trong React Native để giúp tôi gỡ lỗi - lý tưởng là trong tab 'Mạng' của các công cụ phát triển của Chrome.

Có một số vấn đề đã đóng về vấn đề này trên GitHub ( https://github.com/facebook/react-native/issues/4122https://github.com/facebook/react-native/issues/934 ) nhưng tôi không ' t hoàn toàn hiểu chúng. Có vẻ như tôi cần hoàn tác một số polyfills của React Native và sau đó chạy một số lệnh với cờ gỡ lỗi bổ sung và có thể sửa đổi một số cài đặt bảo mật của Chrome? Và rõ ràng có một số vấn đề bảo mật liên quan đến việc thực hiện điều này có thể khiến nó trở thành một ý tưởng khủng khiếp, nhưng không ai liên quan đến chuỗi này đã tuyên bố rõ ràng chúng là gì.

Ai đó có thể cung cấp hướng dẫn từng bước để làm cho tab Mạng hoạt động với React Native, cũng như giải thích về các vấn đề bảo mật liên quan đến việc làm như vậy không?

Câu trả lời:


91

Đây là những gì tôi đang sử dụng trong điểm nhập của ứng dụng của mình

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

XMLHttpRequest = _XHR

CHỈNH SỬA: frevib được liên kết với cú pháp ngắn gọn hơn bên dưới. Cảm ơn frevib!

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

Giải trình:

GLOBAL.originalXMLHttpRequestđề cập đến bản sao XHR của Chrome Dev Tools. Nó được cung cấp bởi RN như một lối thoát hiểm. Giải pháp của Shvetusya sẽ chỉ hoạt động nếu các công cụ dành cho nhà phát triển được mở và do đó cung cấp XMLHttpRequest.

CHỈNH SỬA: Bạn sẽ cần cho phép các yêu cầu gốc chéo khi ở chế độ gỡ lỗi. Với chrome, bạn có thể sử dụng plugin tiện dụng này .

CHỈNH SỬA: Đọc về vấn đề github RN dẫn tôi đến giải pháp này


4
Sau khi đặt đoạn mã đó, tôi có thể thấy yêu cầu trong Bảng điều khiển dành cho nhà phát triển nhưng tất cả yêu cầu của tôi không thành công với trạng thái 404. Bất cứ ai có bất kỳ ý tưởng tại sao điều đó có thể xảy ra?
Peter_Fretter

1
Những công việc này. Mất này từ Github
frevib

1
Điều này không hiệu quả với tôi. Tôi sử dụng giả lập android, và tab mạng show trống thậm chí yêu cầu được gửi
Ville Miekk-oja

19
Điều này không hoạt động nữa, lỗi sau xuất hiện trong bảng điều khiển (không chắc chắn điều gì đã gây ra thay đổi này):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
Hoạt động về phía tôi trên React Native Debugger với thiết lập một lớp này. Cảm ơn một triệu lần, @tryangul
Kaloyan Kosev

86

Tôi không rõ tại sao cho đến nay vẫn chưa có ai chỉ ra giải pháp này. Sử dụng React Native Debugger - https://github.com/jhen0409/react-native-debugger ! Theo ý kiến ​​của tôi, đây là công cụ gỡ lỗi tốt nhất cho React Native và nó cho phép Kiểm tra Mạng.

Hãy xem những ảnh chụp màn hình này.

Nhấp chuột phải và chọn 'Bật kiểm tra mạng' Bật kiểm tra mạng

Nhấp chuột phải và chọn 'Bật kiểm tra mạng' Bật kiểm tra mạng

Gỡ lỗi! Kiểm tra mạng đang hoạt động


10
Nếu bạn đang đọc lướt và thấy câu trả lời này, hãy lưu ý rằng bạn PHẢI nhấp chuột Enable Network Inspectphải để nó hoạt động. Theo mặc định, nó không.
Stephen Saucier

@SamikshaJagtap Tôi đã chỉnh sửa câu trả lời. Hãy xem :)
Kashish Grover,

1
Điều này hoạt động tuyệt vời! Sẽ làm cho cuộc sống của tôi dễ dàng hơn rất nhiều.
Augusto Samamé Barrientos,

1
Chà, tại sao tính năng này lại bị ẩn bằng cách nhấp chuột phải vào bảng điều khiển chính. Không bao giờ biết rằng điều đó tồn tại. Người thay đổi trò chơi. Các câu trả lời của Json đã không hiển thị ... hiển thị ngay khi bật tắt. Cảm ơn!
Matt

1
Tại sao điều này không được biết đến rộng rãi hơn? 🤷‍♂️
Tom Mulkins

46

Tôi sử dụng phần sau trong ứng dụng của mình (Thêm phần này vào tệp điểm nhập app.js chính của bạn):

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

Điều tuyệt vời nhất là nó cũng hiển thị nhật ký tìm nạp trong bảng điều khiển cũng được định dạng tốt.

Ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây

Trên tab mạng:

nhập mô tả hình ảnh ở đây


Thật tuyệt vời! Cảm ơn bạn
DJ Forth

Yêu cầu ban đầu được kích hoạt vào thời điểm nào? Tôi thực sự đang nghĩ đến việc sử dụng điều này như một cơ chế để kích hoạt các mã làm mới nếu một phản hồi có 401. Có vấn đề gì với điều đó không?
tushar747 19/07/18

FANTASTIC Sankalp! Tôi đã gặp khó khăn để Reacotron hoạt động mà không làm hỏng công cụ xây dựng Tàu điện ngầm của tôi. Giải pháp của bạn hoạt động tuyệt vời. Thậm chí hoạt động trong React Native Debugger.
mediaguru,

Giá trị của tiêu đề 'Access-Control-Allow-Origin' trong phản hồi không được là ký tự đại diện '*' khi chế độ thông tin xác thực của yêu cầu là 'bao gồm'. Nguồn gốc ' localhost: 8081 ' do đó không được phép truy cập. Chế độ thông tin xác thực của các yêu cầu do XMLHttpRequest khởi xướng được kiểm soát bởi thuộc tính withCredentials.
Nikhil Mahirrao

Tuyệt vời. Cảm ơn bạn rất nhiều
Đánh dấu

27

Tôi sử dụng Reactotron để theo dõi yêu cầu mạng.

nhập mô tả hình ảnh ở đây


3
điều này thực sự là giải pháp tốt nhất trong số tất cả những câu trả lời ở đây (cho tôi) .. siêu dễ dàng để thiết lập và không có tất cả các tác dụng phụ của việc sử dụng các chrome
Xanh Bot

Bạn lo lắng về tác dụng phụ của việc sử dụng thuốc trị rôm sảy là gì? Reactotron sử dụng Khung nhúng Chromium.
Peter Evan Thỏa thuận

tuyệt vời !! cảm ơn bạn đã cứu tôi những ngày tìm kiếm trên mạng
Alain

12

Tôi biết đây là một câu hỏi cũ, nhưng có một cách an toàn hơn nhiều để làm điều này bây giờ mà không yêu cầu tắt CORS hoặc thay đổi mã nguồn React Native. Bạn có thể sử dụng thư viện bên thứ ba có tên là Reactotron không chỉ theo dõi các lệnh gọi API (sử dụng plugin mạng) mà còn có thể theo dõi cửa hàng Redux của bạn và Sagas với thiết lập bổ sung:

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


Reactotron dường như chỉ hoạt động nếu bạn sử dụng thư viện bên ngoài có tên apisauce. Nó không hoạt động cho tìm nạp thông thường. Vì vậy, nếu bạn muốn theo dõi các yêu cầu được gửi bởi các thư viện bên ngoài trong ứng dụng của mình, thì reactotron là không tốt.
Ville Miekk-oja

1
@ VilleMiekk-oja trên thực tế reactotron hỗ trợ Kết nối mạng với Tìm nạp từ tháng 3, chỉ là tài liệu đã lỗi thời. Tôi đã thử nó bản thân mình, và điều chỉnh nó trên readme :)
Juan Carlos Alpizar Chinchilla

cái này hoạt động xuất sắc; Tôi đã gặp rất nhiều vấn đề với: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad

1
reactotron thực sự dễ cấu hình và hữu ích để theo dõi các cuộc gọi mạng của các ứng dụng gốc phản ứng
Ram

9

Tôi đã có thể gỡ lỗi các yêu cầu của mình trong Chrome bằng cách xóa polyfill mà React Native cung cấp sau khi nhập React Native.

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

Điều này làm việc cho tôi cho các yêu cầu xuất xứ tương tự. Không chắc bạn có cần tắt CORS trong Chrome để làm cho nó hoạt động với nguồn gốc chéo hay không.


Yêu cầu "cùng nguồn gốc", trong bối cảnh các yêu cầu được thực hiện từ ứng dụng React Native là gì? Một cái nằm trên cùng một miền với trình gỡ lỗi (tức là có thể là localhost)?
Mark Amery

đối với trường hợp của tôi, bạn phải tắt CORS trong Chrome để làm cho nó hoạt động với nguồn gốc chéo. kiểm tra plugin chrome này: chrome.google.com/webstore/detail/allow-control-allow-origi/…
Mouhamed Halloul

@MouhamedHalloul bạn có thể giải thích cách bạn sử dụng plugin này không?
alexmngn

@alexmngn này, chỉ cần cài đặt plugin và bật nó lên bu trượt nút, biểu tượng sẽ có màu xanh khi nó bật và màu đỏ khi tắt đó là nó. dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul

5

Trước đây, tôi đã sử dụng GLOBAL.XMLHttpRequesthack để theo dõi các yêu cầu API của mình nhưng đôi khi nó rất chậm và không hoạt động đối với các yêu cầu nội dung. Tôi đã quyết định sử dụng Postman’s proxytính năng để kiểm tra giao tiếp HTTP từ điện thoại. Để biết chi tiết, hãy xem tài liệu chính thức , nhưng về cơ bản, có ba bước đơn giản:

  • Thiết lập proxy trong Postman
  • Kiểm tra địa chỉ IP máy tính của bạn ( $ ifconfig)
  • Định cấu hình proxy HTTP trên thiết bị di động của bạn trong cài đặt Wi-Fi

5

Hãy cẩn thận với mã này.

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

Nó hữu ích và nó tuyệt vời nhưng nó phá hủy tải lên. Tôi dành 2 ngày để tìm hiểu lý do tại sao các tệp đã tải lên đang gửi [đối tượng Object] thay vì tệp thực. Lý do là một đoạn mã ở trên.

Sử dụng nó cho các cuộc gọi thông thường không nhưng cho các cuộc gọi đa phần / biểu mẫu-dữ liệu


2

Tôi khuyên bạn nên sử dụng Charles để kiểm tra các yêu cầu mạng của bạn. Nó thực sự tốt và cung cấp khả năng hiển thị nhiều hơn và cho phép bạn làm những thứ nâng cao.

http://charlesproxy.com


1
Chỉ cần thử Charles và nó dường như chỉ nắm bắt được http://localhost:8081/index.android.bundle?platform=android&dev=true.. làm thế nào để nó nắm bắt được TẤT CẢ các yêu cầu? (Tôi đánh một api bên ngoài)
jakeforaker

API bên ngoài của bạn có sử dụng HTTPS không? Nếu vậy, bạn cần phải cấu hình Charles một chút để nắm bắt được những điều đó.
Ran Yefet

khi sử dụng android, charles có thể gặp một chút vấn đề khi nắm bắt các yêu cầu gửi đi. bạn cần phải cấu hình 'thủ công' trình mô phỏng của mình để truy cập các charles (và lần cuối cùng tôi đã thử, việc truy cập vào bảng cấu hình sẽ không thực hiện được công việc - cần phải chuyển ip proxy từ một dòng lệnh).
joe

1

Nếu bạn đang tìm cách gỡ lỗi các yêu cầu mạng trên phiên bản phát hành của ứng dụng, bạn có thể sử dụng thư viện react-native-network-logger . Nó cho phép bạn theo dõi và xem các yêu cầu mạng trong ứng dụng từ màn hình gỡ lỗi tùy chỉnh.

danh sách react-native-network-logger

chi tiết về react-native-network-logger

Sau đó, bạn có thể đặt điều này sau cờ xây dựng hoặc cờ mạng để vô hiệu hóa nó cho người dùng trong ứng dụng sản xuất.

Chỉ cần cài đặt nó với yarn add react-native-network-loggersau đó thêm nó vào điểm nhập của ứng dụng của bạn:

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

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

Và điều này trên màn hình gỡ lỗi:

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

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

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của gói.


Dude này lib là tuyệt vời! Cảm ơn bạn
Emidomenge

0

Nếu bạn có điện thoại hoặc trình giả lập Android,

  • npx react-native start

Sau đó, mở Android Studio .

Mở androidthư mục dự án của bạn dưới dạng Dự án Android Studio.

nhập mô tả hình ảnh ở đây

Nhấp vào biểu tượng màu xanh lam đó là Android Profiler

Sau khi khởi động Hồ sơ Android, bạn có thể thêm ứng dụng của mình qua biểu tượng dấu cộng màu xám gần SESSIONSnhãn nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể kiểm tra mạng thông qua công cụ này. Bạn có thể thấy các hình tam giác hiển thị hoạt động mạng của mình.

Vui lòng kiểm tra điều này để biết thêm thông tin về việc kiểm tra lưu lượng mạng .


-25

Thêm Trình gỡ lỗi trong js nơi bạn có thể thấy yêu cầu hoặc phản hồi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.