ฉันจะดูคำขอเครือข่าย (สำหรับการดีบัก) ใน React Native ได้อย่างไร


116

ฉันต้องการดูคำขอเครือข่ายของฉันใน React Native เพื่อช่วยฉันในการดีบัก - ควรอยู่ในแท็บ 'เครือข่าย' ของเครื่องมือพัฒนาของ Chrome

มีปัญหาปิดเกี่ยวกับเรื่องนี้ใน GitHub ( https://github.com/facebook/react-native/issues/4122และhttps://github.com/facebook/react-native/issues/934 ) แต่ฉันไม่ t เข้าใจพวกเขาทั้งหมด ดูเหมือนว่าฉันจำเป็นต้องเลิกทำ polyfills ของ React Native จากนั้นเรียกใช้คำสั่งบางอย่างด้วยแฟล็กการดีบักพิเศษและอาจแก้ไขการตั้งค่าความปลอดภัยของ Chrome และเห็นได้ชัดว่ามีปัญหาด้านความปลอดภัยบางอย่างที่เกี่ยวข้องกับการทำสิ่งนี้ซึ่งอาจทำให้เป็นความคิดที่แย่มาก แต่ไม่มีใครเกี่ยวข้องกับเธรดได้ระบุอย่างชัดเจนว่าพวกเขาคืออะไร

ใครช่วยให้คำแนะนำทีละขั้นตอนในการทำให้แท็บเครือข่ายทำงานร่วมกับ React Native ตลอดจนคำอธิบายเกี่ยวกับปัญหาด้านความปลอดภัยที่เกี่ยวข้องในการดำเนินการดังกล่าว

คำตอบ:


118

ฉันไม่แน่ใจว่าทำไมยังไม่มีใครชี้ให้เห็นวิธีแก้ปัญหานี้ ใช้ React Native Debugger - https://github.com/jhen0409/react-native-debugger ! เป็นเครื่องมือดีบักที่ดีที่สุดสำหรับ React Native ในความคิดของฉันและให้การตรวจสอบเครือข่ายนอกกรอบ

ดูภาพหน้าจอเหล่านี้

คลิกขวาและเลือก 'Enable Network Inspect' การเปิดใช้งานการตรวจสอบเครือข่าย

คลิกขวาและเลือก 'Enable Network Inspect' การเปิดใช้งานการตรวจสอบเครือข่าย

แก้จุดบกพร่อง! ตรวจสอบเครือข่ายในการดำเนินการ


11
หากคุณกำลังอ่านและเห็นคำตอบนี้โปรดทราบว่าคุณต้องคลิกขวาและEnable Network Inspectจึงจะทำงานได้ โดยค่าเริ่มต้นจะไม่
Stephen Saucier

1
ใช้งานได้ดีมาก! จะทำให้ชีวิตของฉันง่ายขึ้นมาก
Augusto Samamé Barrientos

3
ว้าวทำไมฟีเจอร์นี้ถึงถูกซ่อนโดยการคลิกขวาที่แผงหลัก ไม่เคยรู้ว่ามีอยู่จริง ตัวเปลี่ยนเกม การตอบสนองของ Json ไม่ปรากฏขึ้น ... แสดงทันทีในการสลับ ขอบคุณ!
แมตต์

2
เหตุใดจึงไม่เป็นที่รู้จักในวงกว้างกว่านี้? 🤷‍♂️
Tom Mulkins

2
อีกอย่างทำไมนี่ไม่ใช่พฤติกรรมเริ่มต้นเมื่อใดก็ตามที่เราไปที่แท็บเครือข่ายหรือทำเครื่องหมายเป็นการตั้งค่า (ช่องทำเครื่องหมายหรือบางประเภท) ในแท็บนั้น!
CyberMew

96

นี่คือสิ่งที่ฉันใช้ในจุดเริ่มต้นของแอพของฉัน

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

XMLHttpRequest = _XHR

แก้ไข: frevib เชื่อมโยงกับไวยากรณ์ที่กระชับมากขึ้นด้านล่าง ขอบคุณ frevib!

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

คำอธิบาย:

GLOBAL.originalXMLHttpRequestหมายถึงสำเนา Chrome Dev Tools ของ XHR RN จัดทำโดย RN เป็นช่องทางหนีภัย วิธีการแก้ปัญหาของ Shvetusya จะทำงานหากเครื่องมือ dev XMLHttpRequestที่มีการเปิดและจึงให้

แก้ไข: คุณจะต้องอนุญาตคำขอข้ามแหล่งที่มาเมื่ออยู่ในโหมดดีบักเกอร์ ด้วย Chrome คุณสามารถใช้ปลั๊กอินที่มีประโยชน์นี้ได้

แก้ไข: อ่านเกี่ยวกับปัญหา RN githubที่นำฉันไปสู่การแก้ปัญหานี้


4
หลังจากที่ฉันใส่รหัสชิ้นนั้นฉันสามารถดูคำขอใน Developer Console ได้ แต่คำขอทั้งหมดของฉันล้มเหลวด้วยสถานะ 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)
Maxim Zubarev

1
ทำงานในด้านของฉันในReact Native Debuggerด้วยการตั้งค่าแบบซับเดียวนี้ ขอบคุณล้านครั้ง @tryangul
Kaloyan Kosev

47

ฉันใช้สิ่งต่อไปนี้ในแอพของฉัน (เพิ่มสิ่งนี้ในไฟล์จุดเข้า 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 ทำงานโดยไม่ทำให้ตัวสร้างรถไฟฟ้าขัดข้อง โซลูชันของคุณใช้งานได้ดี ใช้งานได้แม้ใน React Native Debugger
mediaguru

ค่าของส่วนหัว "Access-Control-Allow-Origin" ในการตอบกลับต้องไม่ใช่สัญลักษณ์แทน "*" เมื่อโหมดข้อมูลรับรองของคำขอเป็น "รวม" Origin ' localhost: 8081 ' จึงไม่ได้รับอนุญาตให้เข้าถึง โหมดหนังสือรับรองของคำขอที่เริ่มต้นโดย XMLHttpRequest ถูกควบคุมโดยแอตทริบิวต์ withCredentials
Nikhil Mahirrao

น่ากลัว ขอบคุณมาก
Mark

28

ฉันใช้Reactotronเพื่อติดตามคำขอเครือข่าย

ป้อนคำอธิบายภาพที่นี่


3
นี่เป็นทางออกที่ดีที่สุดจากคำตอบทั้งหมดที่นี่ (สำหรับฉัน) .. ติดตั้งง่ายสุด ๆ และไม่มีผลข้างเคียงจากการใช้ chrome
Blue Bot

ผลข้างเคียงของการใช้ Chrome ที่คุณกังวลคืออะไร? Reactotron ใช้ Chromium Embedded Framework
Peter Evan Deal

สุดยอด !! ขอบคุณที่ช่วยฉันหลายวันในการค้นหาทางเน็ต
Alain

Mine เชื่อมต่อกับอุปกรณ์ แต่ไม่ได้รับทุกคำขอเฉพาะในการโหลดครั้งแรกเท่านั้น ทำไมถึงเป็นเช่นนั้น?
Jeaf Gilbert

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 ตั้งแต่เดือนมีนาคมมันเป็นเพียงเอกสารที่ล้าสมัย ฉันลองด้วยตัวเองและแก้ไขใน readme :)
Juan Carlos Alpizar Chinchilla

มันใช้งานได้ดีเยี่ยม ฉันพบปัญหามากมายเกี่ยวกับ: GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Petrogad

1
reactotron นั้นง่ายมากในการกำหนดค่าและมีประโยชน์ในการติดตามการเรียกเครือข่ายของแอปพลิเคชันแบบตอบสนอง
แรม

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/…
Mouhamed Halloul

@MouhamedHalloul คุณสามารถอธิบายได้ว่าคุณใช้ปลั๊กอินนี้อย่างไร
alexmngn

@alexmngn เดี๋ยวก่อนเพียงแค่ติดตั้งปลั๊กอินและเปิดใช้งานโดยเลื่อนปุ่มไอคอนควรเป็นสีเขียวเมื่อเปิดอยู่และเป็นสีแดงเมื่อปิดอยู่ dropbox.com/s/242fflwgcew6m50/…
Mouhamed Halloul

6

โปรดระวังรหัสนี้

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

มันช่วยและดีมาก แต่มันทำลายการอัปโหลด ฉันใช้เวลา 2 วันในการพยายามหาสาเหตุว่าทำไมไฟล์ที่อัปโหลดจึงส่ง [object Object] แทนที่จะเป็นไฟล์จริง เหตุผลคือรหัสด้านบน

ใช้สำหรับการโทรปกติไม่ใช่ แต่สำหรับการโทรแบบหลายส่วน / แบบฟอร์มข้อมูล


5

ในอดีตฉันใช้GLOBAL.XMLHttpRequestแฮ็กเพื่อติดตามคำขอ API ของฉัน แต่บางครั้งก็ช้ามากและไม่ได้ผลกับคำขอเนื้อหา ฉันตัดสินใจใช้Postman’s proxyคุณสมบัติตรวจสอบการสื่อสาร HTTP ที่ออกจากโทรศัพท์ สำหรับรายละเอียดโปรดดูเอกสารอย่างเป็นทางการแต่โดยพื้นฐานแล้วมีสามขั้นตอนง่ายๆ:

  • ตั้งค่าพร็อกซีในบุรุษไปรษณีย์
  • ตรวจสอบที่อยู่ IP ของคอมพิวเตอร์ของคุณ ( $ ifconfig)
  • กำหนดค่าพร็อกซี HTTP บนอุปกรณ์มือถือของคุณในการตั้งค่า wifi

3

หากคุณกำลังมองหาการร้องขอของเครือข่ายการแก้ปัญหาในรุ่นที่วางจำหน่ายแอปของคุณคุณสามารถใช้ห้องสมุดตอบสนองพื้นเมืองเครือข่ายคนตัดไม้ ช่วยให้คุณตรวจสอบและดูคำขอเครือข่ายภายในแอพจากหน้าจอดีบักที่กำหนดเอง

รายการตอบสนองพื้นเมืองเครือข่ายคนตัดไม้

รายละเอียด 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 />;

คำเตือน: ฉันเป็นผู้เขียนแพ็คเกจ


1
เพื่อนนี้ยอดเยี่ยมมาก! ขอบคุณ
Emidomenge

2

ฉันขอแนะนำให้ใช้ Charles เพื่อตรวจสอบคำขอเครือข่ายของคุณ มันดีมากและให้การมองเห็นมากขึ้นและช่วยให้คุณทำสิ่งขั้นสูงได้

http://charlesproxy.com


1
เพิ่งลองชาร์ลส์และดูเหมือนว่าจะจับได้เท่านั้นhttp://localhost:8081/index.android.bundle?platform=android&dev=true.. จะทำให้มันจับคำขอทั้งหมดได้อย่างไร? (ฉันกำลังกดปุ่ม API ภายนอก)
jakeforaker

API ภายนอกของคุณใช้ HTTPS หรือไม่ ถ้าเป็นเช่นนั้นคุณต้องกำหนดค่า Charles เล็กน้อยเพื่อให้จับได้เช่นกัน
Ran Yefet

เมื่อใช้ Android ชาร์ลอาจเป็นปัญหาเล็กน้อยในการบันทึกคำขอที่ส่งออก คุณต้อง 'กำหนดค่าโปรแกรมจำลองของคุณด้วยตนเอง' เพื่อเข้าถึงชาร์ล (และครั้งสุดท้ายที่ฉันลองไปที่แผงการกำหนดค่าจะไม่ทำงาน - พร็อกซี ip จำเป็นต้องส่งผ่านจากอินสแตนซ์บรรทัดคำสั่ง)
joe

1

หากคุณมีโทรศัพท์ Android หรือโปรแกรมจำลอง

  • npx react-native start

จากนั้นเปิดAndroid Studioสตูดิโอ

เปิดandroidโฟลเดอร์ของโครงการของคุณเป็นโครงการ Android Studio

ป้อนคำอธิบายภาพที่นี่

คลิกไอคอนสีน้ำเงินที่เป็นไอคอน Android Profiler

หลังจากที่ Android Profiler เริ่มต้นคุณสามารถเพิ่มแอปของคุณผ่านไอคอนSESSIONSเครื่องหมายบวกสีเทาใกล้ป้ายกำกับ ป้อนคำอธิบายภาพที่นี่

ตอนนี้คุณสามารถตรวจสอบระบบเครือข่ายผ่านเครื่องมือนี้ คุณสามารถดูรูปสามเหลี่ยมที่แสดงกิจกรรมเครือข่ายของคุณ

กรุณาตรวจสอบนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบเครือข่ายการจราจร


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.