নেটিভ ফেচ প্রতিক্রিয়া () নেটওয়ার্ক অনুরোধ ব্যর্থ


145

আমি যখন react-native init(আরএন সংস্করণ 0.29.1) ব্যবহার করে একেবারে নতুন প্রকল্প তৈরি করি এবং পাবলিক ফেসবুক ডেমো মুভি এপিআই-তে রেন্ডার পদ্ধতিতে একটি আনয়ন করি, এটি একটি নিক্ষেপ করে Network Request Failed। খুব অকেজো স্ট্যাক ট্রেস রয়েছে এবং আমি ক্রোম কনসোলে নেটওয়ার্ক অনুরোধগুলি ডিবাগ করতে পারি না। এখানে আমি পাঠাচ্ছি:

fetch('http://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        return responseJson.movies;
      })
      .catch((error) => {
        console.error(error);
      });

1
আমি নিশ্চিত নই. আমি আইওএস সিমুলেটর ব্যবহার করছি এবং আমি ভেবেছিলাম এটি আমার কম্পিউটারের ইন্টারনেট সংযোগ ব্যবহার করেছে
আলেক হার্স্ট

সিমুলেটরটি ম্যানুয়ালি লোড করার চেষ্টা করুন এবং
সাফারিতে

5
http-> https(যদি সম্ভব হয়) সম্ভবত আপনার সমস্যাটি সমাধান করবে
নিক জুবার

1
আমি আইপি ব্যবহার করছিলেন 192.168.1.25:3000থেকে ifconfigযে আইপি থেকে আমার সার্ভারে বাঁধাই ছাড়াrails server --binging=192.168.1.25 --port=3000
ফ্যাব্রিজিও Bertoglio

1
হ্যাঁ আমি সব চেষ্টা করেছিলাম। আমার পক্ষে কিছুই কাজ
করেনি

উত্তর:


140

এখানে সমস্যাটি হ'ল আইওএস এইচটিটিপি অনুরোধগুলিকে ডিফল্টরূপে অনুমতি দেয় না, কেবল এইচটিটিপিএস। আপনি যদি HTTP অনুরোধগুলি সক্ষম করতে চান তবে এটিতে আপনার যুক্ত করুন info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2
এই উত্তরটি আমার পক্ষে কাজ করেছিল। রিয়েট নেটিভ নতুনদের জন্য অন্যদের জন্য, এই ফাইলটি (তথ্য.পুস্টলিস্ট) এক্সকোডের মাধ্যমেও সম্পাদনা করা যেতে পারে: stackoverflow.com/a/38219454/1299792
মার্কার

86
অ্যান্ড্রয়েড সম্পর্কে কি? অ্যান্ড্রয়েডেও আমি একই সমস্যার মুখোমুখি।
বিজয় শর্মা

16
যথাযথভাবে। অ্যান্ড্রয়েডের উত্তর কি কারও কাছে আছে?
জাচ কুক

1
আমি যখন এটি আইওএস / বিল্ড / ইনফো.লিস্টে রাখি এবং চালিত করি: নেটিভ রান-আইওসকে প্রতিক্রিয়া জানায় আইওএস / বিল্ড / ইনফরমেশন.পল্লিস্ট আমার ওভাররাইট করা হয় এবং আমার পরিবর্তনগুলি কি ছেড়ে দেওয়া উচিত?
জর্জে ওয়ান্ডার সান্টানা ইউরিয়া

1
@ জর্জেওয়ান্ডারসান্টানা ইউরিয়া [আপনার_প্রজেক্ট_ফোল্ডার_নাম] / আইওএস / [আপনার_প্রজেক্ট_ফোল্ডার_নাম] / ইন.ফো.পিস্ট
কেজিওস

58

HTTP- র জন্য সমস্ত ডোমেনের অনুমতি দেওয়ার জন্য প্রস্তাবিত নয়। কেবলমাত্র প্রয়োজনীয় ডোমেনগুলির জন্য ব্যতিক্রম করুন।

উত্স: আইওএস 9 এবং ওএসএক্স 10.11 এ অ্যাপ ট্রান্সপোর্ট সুরক্ষা ব্যতিক্রমগুলি কনফিগার করছে

আপনার অ্যাপ্লিকেশনটির তথ্য.পলিট ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

27
অ্যান্ড্রয়েড সম্পর্কে কি?
arisalexis

3
আমার রিএ্যাক্ট নেটিভ অ্যাপ্লিকেশনটিতে একাধিক ডিরেক্টরিতে একাধিক তথ্য.প্লেস্ট ফাইল রয়েছে বলে মনে হয়। কোন ফোল্ডারে সঠিক ফাইলটি পরিবর্তন করতে হবে?
মার্কার

2
@ মার্কলার [আপনার_প্রজেক্ট_ফোল্ডার_নাম] / আইওএস / [আপনার_প্রজেক্ট_ফোল্ডার_নাম] / ইনফো.প্লিস্ট
স্টিচ

আমি যদি আমার লোকালহোস্টটি এখানে ব্যবহার করি: <key> yourerver.com </key>, প্রস্তুত হওয়ার পরে আমি প্রকাশের জন্য প্রস্তুত হলে, আমি এটি পরিবর্তন করতে হবে, সঠিক?
অনায়ো ওলেরু

36

আমি localhostঠিকানাটির জন্য ব্যবহার করছিলাম , যা স্পষ্টতই ভুল ছিল। সার্ভারের আইপি ঠিকানা (এ্যামুলেটরটি যে নেটওয়ার্কে রয়েছে) দিয়ে এটি প্রতিস্থাপনের পরে, এটি পুরোপুরি কাজ করেছিল।

সম্পাদন করা

অ্যান্ড্রয়েড এমুলেটরে, বিকাশ মেশিনের ঠিকানা 10.0.2.2এখানে আরও ব্যাখ্যা

জিনমোশনটির জন্য, ঠিকানাটি 10.0.3.2। আরও তথ্য এখানে


4
ধন্যবাদ. সম্ভবত আমি দেখেছি শুধুমাত্র প্রতিক্রিয়া যা অ্যান্ড্রয়েডের জন্য কাজ করে। আমার নেটওয়ার্কগুলির আইপি ঠিকানা ব্যবহার করেছে এবং এটি কার্যকর হয়। উদাহরণস্বরূপhttp://<Network IP emulator connects to>:<port where API is served>/api/tasks
ব্র্যান্ডন বেনিফিল্ড

1
"HTTP: //" ভুলে যাবেন না অন্যথায় এটি কাজ করবে না ... ভাবছিল কেন এটি পোস্টম্যানের উপর কাজ করবে তবে আনতে হবে না
মৌচেগ

@ মাহমুডভিসিএস আপনার উত্তর আমাকে অনেক সাহায্য করে, আপনাকে অনেক ধন্যবাদ, আমি অ্যান্ড্রয়েড এমুলেটর ব্যবহার করছি।
পেনা পিন্টাদা

14

আমাদের জন্য এটি ছিল কারণ আমরা কোনও ফাইল আপলোড করছি এবং আরএন ফাইলপিকার সঠিক মাইম প্রকারটি দেয় নি। এটি কেবল আমাদের চিত্রটি প্রকার হিসাবে দিয়েছে। আনতে কাজটি পেতে আমাদের এটিকে 'ইমেজ / জেপিজি' করতে হবে।

form.append(uploadFileName, {
  uri : localImage.full,
  type: 'image/jpeg',
  name: uploadFileName
 })

@ জোহানসন্তানা আপনি সম্ভবত কাঁচা চিত্রের ডেটাটি দেখে এবং শুরু থেকেই পেতে পারেন, তবে প্রতিক্রিয়া নেটিভ বাছাইকারী আমার জন্য 'চিত্র' ফিরে এসেছিল।
নিকजे

10

নেটিভ ডকস প্রতিক্রিয়া এর জন্য উত্তর দেয়।

অ্যাপল অন্তর্নিহিত ক্লিয়ারটেক্সট এইচটিটিপি রিসোর্স লোডকে অবরুদ্ধ করেছে। সুতরাং আমাদের নীচে আমাদের প্রকল্পের তথ্য.প্লেস্ট (বা সমতুল্য) ফাইল যুক্ত করতে হবে।

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

নেটিভ ডকস প্রতিক্রিয়া করুন -> বিদ্যমান অ্যাপ্লিকেশনগুলির সাথে সংহতকরণ -> আপনার একীকরণের পরীক্ষা করুন -> অ্যাপ পরিবহন সুরক্ষা ব্যতিক্রম যুক্ত করুন


9

সার্ভার কনফিগারেশনে সমস্যা হতে পারে।

অ্যান্ড্রয়েড 7.0 এর এখানে একটি বাগ বর্ণিত রয়েছে । ভিকি চিজওয়ানির প্রস্তাবিত কর্মশালা:

উপবৃত্তাকার কার্ভ prime256v1 ব্যবহার করতে আপনার সার্ভারটি কনফিগার করুন। উদাহরণস্বরূপ, Nginx 1.10 এ আপনি ssl_ecdh_curve prime256v1 সেট করে এটি করেন;


7

অ্যান্ড্রয়েডেও আমি একই সমস্যা পেয়েছি তবে আমি এর সমাধান পেতে সক্ষম হয়েছি। অ্যান্ড্রয়েড ডিফল্টরূপে API স্তর 28 এর পর থেকে ক্লিয়ারটেক্সট ট্র্যাফিক (নন-https- অনুরোধগুলি) অবরুদ্ধ করছে। যাইহোক, প্রতিক্রিয়া-স্থানীয় একটি ডিবাগ সংস্করণে নেটওয়ার্ক-সুরক্ষা-কনফিগারেশন যুক্ত করে ( android/app/src/debug/res/xml/react_native_config.xml) যা কিছু ডোমেন (লোকালহোস্ট এবং অ্যাভিডি / জেনোমোশনের জন্য হোস্ট আইপি) সংজ্ঞায়িত করে, যা দেব মোডে এসএসএল ছাড়াই ব্যবহার করা যায়। HTTP অনুরোধের অনুমতি দেওয়ার জন্য আপনি সেখানে আপনার ডোমেন যুক্ত করতে পারেন।

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
    <domain includeSubdomains="true">dev.local</domain>
  </domain-config>
</network-security-config>

এটি আমার পক্ষে নেটিভ 0.59 এবং টার্গেট
এসডিকে

7

আমি, "http" এবং মাত্র যোগ করে সমাধান করা সংখ্যার কারণ অ্যানড্রইড 9 একই সমস্যা পেয়েছিলাম usesCleartextTraffic = "সত্য": অ্যান্ড্রয়েড মধ্যে Andro আইডি

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
  android:usesCleartextTraffic="true"
 .......>
 .......
</application>


2
ধন্যবাদ, এটি আমার জন্যও কাজ করেছিল। এটি ঘটেছিল কারণ Android 28
গুই হার্জোগ

5

আমি একই সমস্যাটি অ্যান্ড্রয়েড এমুলেটরটিতে এসে পৌঁছেছি, যেখানে আমি একটি বৈধ শংসাপত্র সহ একটি বহিরাগত HTTPS URL অ্যাক্সেস করার চেষ্টা করেছি। কিন্তু প্রতিক্রিয়া-নেটিভ এ URL টি আনতে ব্যর্থ

'fetch error:', { [TypeError: Network request failed]
sourceURL: 'http://10.0.2.2:8081/index.delta?platform=android&dev=true&minify=false' }

1) লগগুলিতে সঠিক ত্রুটিটি সনাক্ত করতে, আমি অ্যাপটিতে Cmd + M ব্যবহার করে প্রথমে 'ডিবাগ জেএস রিমোটলি' সক্ষম করেছিলাম

2) ত্রুটিটি রিপোর্ট করা হয়েছিল

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

3) আমি এই পদ্ধতিটি ব্যবহার করে URL টির বৈধ শংসাপত্র যুক্ত করেছি -> পদক্ষেপ 2

http://lpains.net/articles/2018/install-root-ca-in-android/

এই শংসাপত্রটি ব্যবহারকারী ট্যাবে যুক্ত হয়।

4) android:networkSecurityConfigঅ্যান্ড্রয়েডম্যানিয়েস্ট.এক্সএমএল এ বিশিষ্ট বৈশিষ্ট্য যুক্ত করুন

একটি নেটওয়ার্ক সুরক্ষা কনফিগারেশন ফাইল যুক্ত করুন res/xml/network_security_config.xml:

<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="user"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

এটি কাজ করে এবং আপনাকে একটি প্রত্যাশিত প্রতিক্রিয়া দেওয়া উচিত।


কাজ করার জন্য আমার কেবল চার ধাপ করা দরকার। ধন্যবাদ!
ব্রুনো সেরানানো

4

অ্যান্ড্রয়েড- এর জন্য আমার এই সমস্যা ছিল

URL- লোকালহোস্ট / authToken.json - কাজ করেনি :(

URL- 10.106.105.103/authToken.json - কাজ করেনি :(

ইউআরএল- http://10.106.105.103/authToken.json - কাজ করেছেন :): ডি

দ্রষ্টব্য- মেশিন আইপিএড্রেস খুঁজতে ifconfigলিনাক্সে বা ipconfigউইন্ডোজে ব্যবহার করুন


4

অ্যান্ড্রয়েড ব্যবহারকারীর জন্য:

  1. localhostল্যান আইপি ঠিকানাগুলিতে এস প্রতিস্থাপন করুন কারণ আপনি যখন কোনও অ্যান্ড্রয়েড ডিভাইসে প্রকল্পটি চালাচ্ছেন, লোকালহোস্ট আপনার কম্পিউটারের পরিবর্তে অ্যান্ড্রয়েড ডিভাইসের দিকে ইঙ্গিত করছে, উদাহরণ: এতে পরিবর্তন http://localostকরুনhttp://192.168.1.123

  2. যদি আপনার অনুরোধের URL টি এইচটিপিএস এবং আপনার অ্যান্ড্রয়েড ডিভাইস একটি প্রক্সি অধীনে থাকে তবে ধরে নিন যে আপনি আপনার অ্যান্ড্রয়েড ডিভাইসে ব্যবহারকারী-সংযুক্ত সিএ (বার্প স্যুট এর সিএ বা চার্লসের সিএ) ইনস্টল করেছেন, নিশ্চিত করুন যে আপনার অ্যান্ড্রয়েড সংস্করণটি নওগটের (7.0) নীচে রয়েছে , কারণ : অ্যান্ড্রয়েড নওগাতে বিশ্বস্ত শংসাপত্র কর্তৃপক্ষগুলিতে পরিবর্তন

    ব্যবহারকারী-যুক্ত সিএএস
    সমস্ত অ্যাপ্লিকেশন ডেটার সুরক্ষা অ্যান্ড্রয়েড অ্যাপ্লিকেশন স্যান্ডবক্সের একটি মূল লক্ষ্য। অ্যান্ড্রয়েড নওগ্যাট কীভাবে অ্যাপ্লিকেশনগুলি ব্যবহারকারী- এবং অ্যাডমিন-সরবরাহিত CAগুলির সাথে ইন্টারঅ্যাক্ট করে তা পরিবর্তন করে। ডিফল্টরূপে, অ্যাপ্লিকেশনগুলি যা এপিআই স্তরের 24 লক্ষ্য করে। ডিজাইনের মাধ্যমে such যেমন সিএকে সম্মান জানাবে না যদি না অ্যাপ্লিকেশন স্পষ্টভাবে নির্বাচন না করে safe এই নিরাপদে বাই ডিফল্ট সেটিংস অ্যাপ্লিকেশন আক্রমণ আক্রমণটিকে হ্রাস করে এবং নেটওয়ার্ক এবং ফাইল-ভিত্তিক অ্যাপ্লিকেশন ডেটার ধারাবাহিকভাবে পরিচালনার জন্য উত্সাহ দেয়।


3

অ্যান্ড্রয়েডের জন্য, আপনি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এ অনুমতি যুক্ত করতে মিস করেছেন, নিম্নলিখিত অনুমতি যুক্ত করার প্রয়োজন।

<uses-permission android:name="android.permission.INTERNET" /> 

আমি ইতিমধ্যে এটি পেয়েছি যদিও আমি ত্রুটিটি পাচ্ছি, অন্য কোনও কর্মসূচী নেই?
মাসুদ_মোনি

@ মাসুদ_মনি আপনি কি সমস্যার সমাধান করার উপায় খুঁজে পাচ্ছেন? আমার এখনও একই সমস্যা রয়েছে
রাফায়েল রতিরোতি

@ রাফায়েলরোটিরোটি হ্যাঁ আমি এই সমস্যাটি সমাধান করেছি, তবে এটি কিছুটা সময় হয়ে গেলেও এটি মনে রাখা শক্ত, আপনি যদি অনুমতিটি ব্যবহার করেন এবং এখনও সমস্যার মুখোমুখি হন তবে দয়া করে বিশদটি ভাগ করুন। আমি সাহায্য করার জন্য যথাসাধ্য চেষ্টা করব, এবং আপনার এটির জন্য অন্যদেরও থাকতে হবে
masud_moni

@ মাসুদ_মনি আপনাকে ধন্যবাদ, রান ইফকনফিগ কমান্ডের পরে প্রদত্ত আইপি ব্যবহার করে আমি এই সমস্যাটি সমাধান করেছি। এভিডি একটি ভার্চুয়াল ডিভাইস তৈরি করে, সুতরাং ভার্চুয়াল মেশিনগুলির চেয়ে একই তত্ত্বটি ব্যবহার করে যা আমার ডিভাইসে 127.0.0.1 এ হোস্ট করা কিছুই নয়। তাই আমি 192.168.xx আইপি ব্যবহার করি এবং পাশাপাশি সবকিছু ঠিকঠাক কাজ করে
রাফায়েল রতিরোতি

2

আমারও একই সমস্যা আছে আমার ক্ষেত্রে লোকালহোস্টের অনুরোধগুলি কাজ করছিল এবং হঠাৎ বন্ধ হয়ে গেল। দেখা গেল যে সমস্যাটি হ'ল আমি আমার অ্যান্ড্রয়েড ফোনে আমার ওয়াইফাইটি বন্ধ করে দিয়েছিলাম।


2

এটি আমার পক্ষে কাজ করেছে, অ্যান্ড্রয়েড একটি বিশেষ ধরণের আইপি ঠিকানা 10.0.2.2 এর পরে পোর্ট নম্বর ব্যবহার করে

import { Platform } from 'react-native';

export const baseUrl = Platform.OS === 'android' ?
    'http://10.0.2.2:3000/'
: 
'http://localhost:3000/';

1

: যদি আপনি REST API জন্য Docker ব্যবহার করেন, আমার জন্য একটি কাজ যদি হোস্টনাম প্রতিস্থাপন ছিল http://demo.test/apiমেশিন IP ঠিকানার সাথে: http://x.x.x.x/api। আপনার ওয়্যারলেস নেটওয়ার্কে আপনার আইপিভি 4 কী আছে তা যাচাই করে আপনি আইপি পেতে পারেন। আপনার ফোন থেকে ওয়াইফাই করা উচিত।


1

এফআইপি আনার জন্য আপনার ত্রুটি কেসটি পরিচালনা করা উচিত।

উদাহরণ স্বরূপ:

fetch(authURl,{ method: 'GET'})
.then((response) => {      
  const statusCode = response.status;
  console.warn('status Code',statusCode);
  if(statusCode==200){
    //success code
  }else{
    //handle other error code
  }      
},(err) => {
  console.warn('error',err)
})
.catch((error) => {
  console.error(error);
  return error;
});

0
  1. android:usesCleartextTraffic="true"AndroidManLive.xML এ লাইন যুক্ত করুন ।

  2. আপনার অ্যান্ড্রয়েড ফোল্ডার থেকে সমস্ত ডিবাগ ফোল্ডার মুছুন।


-1

শুধু আপনার আনার পরিবর্তন আছে ....

fetch('http://facebook.github.io/react-native/movies.json')
    .then((response) => response.json())
    .then((responseJson) => {
        /*return responseJson.movies; */
        alert("result:"+JSON.stringify(responseJson))
        this.setState({
            dataSource:this.state.dataSource.cloneWithRows(responseJson)
        })
     }).catch((error) => {
         console.error(error);
     });

-1

অ্যান্ড্রয়েড ডিভাইসগুলির জন্য, আপনার প্রকল্পের মূল ফোল্ডারে যান এবং কমান্ডটি চালান:

adb reverse tcp:[your_own_server_port] tcp:[your_own_server_port]

যেমন, adb reverse tcp:8088 tcp:8088

এটি আপনার শারীরিক ডিভাইসটিকে (যেমন অ্যান্ড্রয়েড ফোন) আপনার বিকাশ মেশিনে চলমান লোকালহোস্ট সার্ভারটি (যেমন আপনার কম্পিউটার) শুনতে পাবে http: // লোকালহোস্ট: [আপনার_সাহীন_সার্ভার_পোর্ট]

এর পরে, আপনি সরাসরি http:localhost:[your_port] /your_apiআপনার প্রতিক্রিয়া-নেটিভ fetch() কলটিতে ব্যবহার করতে পারেন ।


-1

অ্যান্ড্রয়েডের জন্য, অ্যান্ড্রয়েড যুক্ত করুন: নেটওয়ার্কসিকিউরিটি কনফিগ = "@ এক্সএমএল / নেটওয়ার্ক_সিকিউরিটি_কনফিগ" এ অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে অ্যাপ্লিকেশন ট্যাগটিতে এইভাবে:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                        ... >
            ...
        </application>
    </manifest>

নেটওয়ার্ক_সিকিউরিটি_কনফিগ.এক্সএমএল ফাইল সামগ্রী:

<?xml version='1.0' encoding='utf-8'?>
<network-security-config>
<debug-overrides>
    <trust-anchors>
        <!-- Trust user added CAs while debuggable only -->
        <certificates src="user" />
    </trust-anchors>
</debug-overrides>

<!-- let application to use http request -->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

আপনি দয়া করে বিস্তারিত বলতে পারেন, এবং বিস্তারিতভাবে ব্যাখ্যা করতে পারেন? আমি শুধু কৌতূহল করছি কিভাবে এটি কাজ করে?
গণেশদেশমুখ

মন্তব্যটি পরিবর্তন করেছেন, আশা করি এটি সাহায্য করবে
xyz

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.