Axios: Axios tidak berfungsi dengan Android (emulator) meningkatkan Kesalahan Jaringan

Dibuat pada 25 Jun 2017  ·  58Komentar  ·  Sumber: axios/axios

Saya baru dengan React Native, dan saya bermain-main dengan komponen dan permintaan http ajax, dan semuanya berjalan baik dengan emulator iOs, sampai saya berpikir untuk menguji pada emulator Android.

Ini adalah kelas Http saya:

import 'url-search-params-polyfill';
import axios from 'axios';
import { AsyncStorage } from 'react-native';
import Rx from 'rxjs/Rx';

let _HttpServiceInstance = null;

class HttpService {

  constructor(envStr) {
    console.log('DEFAULT', axios.defaults);
    if(!_HttpServiceInstance){
      this.__proto__.ghtnk = null;
      axios.defaults.baseURL = this.getBaseUrlApi()[envStr || 'DEV'];
      axios.interceptors.response.use(
        (resp) => {
          let ghresp = resp.data || resp;
          ghresp.status = resp.data ? resp.data.status : resp.status;
          return ghresp;
        },
        (err) => {
          if( err.status === 401 ){
              this.removeToken();
              // go to login
          }
          return Promise.reject(err);
        }
      )
      _HttpServiceInstance = this;
    }
    return _HttpServiceInstance;
  }

  getBaseUrlApi = () => {
    return {
      DEV : 'https://dev-api.domainname.com/',
      TEST: 'https://test-api.domainname.com/',
      QA  : 'https://qa-api.domainname.com/',
      LIVE: 'https://api.domainname.com/',
    };
  }

  switchBaseUrlApi(envStr) {
    axios.defaults.baseURL = this.getBaseUrlApi()[envStr];
  }

  getToken = (callback) => {
      let promise = AsyncStorage.getItem('ghtkn');
      if( callback ){
        promise.then(callback, () => { console.log('getToken: ', err) });
      }
      else return promise;
  };

  setToken = (token) => {
    return AsyncStorage.setItem('ghtkn', token);
  };

  removeToken = () => {
    AsyncStorage.removeItem('ghtkn');
  };

  setAuthHeaders = (callback, noNeedToken) => {
    if ( noNeedToken ) {
      callback(); return;
    }
    this.getToken(
      (token) => {
        if (token) {
          axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;
          callback();
        }
        else{ console.log('NO TOKEN PRESENT'); }
      },
      (err) => { console.log('GET TOKEN: ', err); },
    );
  };

  // GET
  get = (url) => {
    let subject = new Rx.Subject();
    this.setAuthHeaders((token) => {
      axios.get(url).then(
        (data) => { subject.next(data); },
        (err) => { console.log('GET: ', err); }
      );
    });
    return subject;
  };

  // POST
  post = (url, payload, noNeedToken) => {
    let subject = new Rx.Subject();
    this.setAuthHeaders(() => {
      axios.post( url, this.setParams(payload)).then(
        (resp) => { subject.next(resp); },
        (err) => {
          console.log('POST ERROR');
          console.log(err.request, Object.keys(err) );
          subject.error(err);
        }
      );
    }, noNeedToken);
    return subject;
  };

  // PUT
  put = (url, payload) => {
    let subject = new Rx.Subject();
    this.setAuthHeaders((token) => {
      axios.put( url, this.setParams(payload)).then(
        (resp) => { subject.next(resp); },
        (err) => { console.log('PUT: ', err); }
      );
    });
    return subject;
  };

  // LOGIN
  login = (user, pw) => {
    return this.post('user/authentication', {username: user, password: pw}, true)
               .do((resp) => { this.setToken(resp.token); })
  };

  setParams = (jsonParams) => {
    let params = new URLSearchParams();
    for(param in jsonParams){
      if( jsonParams.hasOwnProperty(param) ){
        params.append(param, jsonParams[param]);
      }
    }
    return params;
  };

}

export { HttpService };

Ini adalah kesalahan yang saya dapatkan dari permintaan posting, menggunakan fungsi login() yang saya buat menggunakan axios.post()

screen shot 2017-06-24 at 22 32 54

CATATAN:

  • Saya menggunakan versi terbaru Axios ^0.16.2

  • AndroidManifest.xml saya berisi:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  • API berada di bawah VPN, seperti yang saya tulis semua berfungsi dengan baik dengan emulator iOS tetapi tidak dengan emulator Android.

Komentar yang paling membantu

Jika Anda mencoba memanggil localhost pada simulator Android yang dibuat dengan AVD, mengganti localhost dengan 10.0.2.2 memecahkan masalah bagi saya.

Semua 58 komentar

Saya mendapatkan kesalahan ini juga dengan Android di React Native. Ini berfungsi baik dengan iOS.

Saya juga mendapatkan kesalahan ini dengan Android di React Native.

Apakah axios benar-benar tidak didukung di Android? 😨.

Masalah yang sama, apakah ada yang menyelesaikannya?

akan berfungsi di iOS tetapi tidak akan berfungsi di Android. HTTPS tidak mendukung di android.

tanda

Masalah yang sama dalam kondisi yang berbeda.

Axios melempar Kesalahan Jaringan, tetapi hanya di Simulator iOS.

Bekerja dengan Baik di android (Diuji pada Perangkat yang sebenarnya). Menggunakan server AWS dengan http bukan https .

Tolonglah

GET tidak dapat menggunakan body .
Saya pikir Anda harus menghapus data Anda saat menggunakan GET.

axios.interceptors.request.use((config) => {
  if (config.method !== 'get') {
    config.data = qs.stringify(config.data) // fix Rails i18n error
  }
  if (typeof config.params === 'undefined') {
    config.params = {}
  }
  return AppSettingService.getAppSetting()
    .then((appSetting) => {
      config.params.locale = appSetting.locale
      config.params.currency = appSetting.currency
      return ProfileService.getCurrentUser()
        .then((currentUser) => {
          if (currentUser) {
            config.headers.common.Authorization = currentUser.token
          }
          return config
        })
    })
})

Saya memiliki masalah serupa, tetapi saya memperbaiki Kesalahan Jaringan ini dengan menghilangkan data saat menggunakan GET.

@hzburki Saya mendapat masalah yang sama seperti Anda, tetapi saya menemukan bahwa, pada emulator Android, batas waktu untuk permintaan jaringan tampaknya 2 atau 3 menit. Namun, menyetel batas waktu default Axios tidak berfungsi pada emulator android.

Hai @hpb0412 ... Maaf sudah lama sejak saya memposting ini jadi saya tidak ingat bagaimana saya bisa melewati masalah ini. Namun melihatnya sekarang sepertinya saya belum mengaktifkan Keamanan Transportasi Aplikasi untuk iPhone pada saat itu, karena berfungsi dengan baik di Android. Tapi ini tidak membantu Anda.

Ini akan membantu melihat log kesalahan di backend tempat Anda mengirim permintaan GET dan mencoba permintaan yang sama dengan Postman untuk memastikan tidak ada yang salah pada kode back-end.

sepertinya "masalah pengambilan" yang saya temui di React Native khusus untuk Android 7.0.
Alasannya adalah menggunakan sertifikat yang ditandatangani sendiri

Saya mendapatkan kesalahan jaringan yang sama dengan permintaan Get sederhana

`var contoh = axios.create({
baseURL: getEnvVars.apiHost,
batas waktu: 5000,
header: {'x-api-key': getEnvVars.apiKey}
});

    return instance.get('/products?brand=' + params.brand)
        .then((response) => {
            console.log(response.data);
        })
        .catch((error) => {
            console.log(error);
        });`

`▼Kesalahan Jaringan

  • node_modules/axios/lib/core/createError.js:16:24 di createError
  • node_modules/axios/lib/adapters/xhr.js:87:25 di handleError
  • node_modules/raven-js/src/raven.js:377:26 terbungkus
  • node_modules/event-target-shim/lib/event-target.js: 172:43 di dispatchEvent
  • node_modules/react-native/Libraries/Network/XMLHttpRequest.js:567:29 di setReadyState
  • node_modules/react-native/Libraries/Network/XMLHttpRequest.js:397:25 di __didCompleteResponse
  • node_modules/react-native/Libraries/Network/XMLHttpRequest.js:503:16 di
  • node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:180:12 di emit
  • node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:351:47 di __callFunction
  • node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:116:26 in
  • node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:314:6 di __guardSafe
  • node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:115:17 dalam panggilanFunctionReturnFlusedQueue`

Saya memiliki masalah yang sama dan menemukan solusi. Masalah saya terkait dengan domain saya.
Saya menemukan bahwa domain __tidak boleh memiliki _ __ di dalamnya. Misalnya, https://my_api.mydomain.com tidak akan berfungsi. Tapi, https://my-api.mydomain.com atau https://api.mydomain.com akan bekerja. ~Perhatikan bahwa sertifikat SSL saya berasal dari CloudFlare jadi ini mungkin masalah sertifikat SSL juga.~

Sunting: Menurut http://ssllabs.com , kedua sertifikat itu identik dan seharusnya berfungsi pada semua versi Android terakhir.

tolong bantu dengan ini, itu masih tidak berhasil, saya mengalami masalah yang sama

@hsunami10 Apa domain Anda? Apakah Anda memiliki repo dengan aplikasi Anda?

@ hsunami10 Saya mengatasi masalah ini dengan menyiapkan server pementasan eksternal dan menunjuk ke sana untuk pengujian dengan emulator.

Teman-teman, saya juga berjuang dalam masalah ini untuk berhenti sementara. Tapi saya menemukan masalah createError jaringan pos axios saya di perangkat Android sekarang. Alasan untuk Kesalahan Jaringan axios adalah karena data formulir yang saya berikan ke axios berisi jenis objek data yang salah, saya kira. Saya telah menyertakan objek gambar (objek ImagePicker dari Expo) sebagai salah satu parameter data formulir yang saya pikir tidak diterima oleh aksio. Axios mungkin hanya menerima string, float, int, atau gambar sebagai param. gambar tidak dapat lulus sebagai param, ini bukan jenis gambar, ini adalah objek asli yang bereaksi, saya telah menghapusnya dan menyertakan bidang gambar sebagai param dengan menetapkan image.uri ke nilai param kemudian berfungsi. Semoga ini bisa membantu beberapa orang yang mungkin mengalami masalah yang sama seperti yang saya hadapi sebelumnya.
Menghapus beberapa data formulir Anda satu per satu saat Anda menguji kesalahan Jaringan axios, Anda akan mengetahui mana yang menjadi penyebab masalah.

Jika Anda mencoba memanggil localhost pada simulator Android yang dibuat dengan AVD, mengganti localhost dengan 10.0.2.2 memecahkan masalah bagi saya.

Dengan proses media upload kasus, saya menyarankan Anda semua untuk menggunakan rn-fetch-blob sebagai gantinya.

@VitaliiK91 maksud Anda pengaturan ADB di Genymotion. Di mana pengaturan localhost yang harus diganti?

Saya mengalami masalah yang sama dengan permintaan GET sederhana ke Rest API saya yang dihosting di heroku. Pada emulator IOS, permintaan yang sama berfungsi dengan baik.

axios.get('https://my-app-api.herokuapp.com/api') .then(response => { this.setState({ bets: response.data }) });

Saya mencoba menggunakan tajuk juga, tetapi tidak berhasil juga.

axios.get('https://my-app-api.herokuapp.com/api', { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json; charset=UTF-8', }, }) .then(response => { this.setState({ bets: response.data }) });

Saya juga mengalami masalah yang sama. Ini hanya terkait dengan Android 7.0, untuk versi Android lainnya, ini berfungsi dengan baik.
Masalahnya adalah permintaan posting https Axios bahkan tidak sampai ke server. Gagal dengan Kesalahan Jaringan hanya karena Jabat Tangan SSL gagal.
Ini bekerja dengan baik dengan semua versi iOS serta semua versi Android kecuali Android 7.0.
Sepertinya Android 7.0 memiliki beberapa masalah serius di okhttp.

Saya mengalami masalah yang sama juga. Saya menggunakan Android versi terbaru dan saya sudah mencoba mengirim teks sederhana ke server saya tetapi masih menerima kesalahan jaringan. Hal yang sama berlaku untuk mendapatkan permintaan

Saya akhirnya berhasil memperbaiki masalah ini. Menggunakan alamat IP jaringan saya dan berfungsi. misalnya http://:/api

Lebih banyak di sini

Jika Anda mencoba memanggil localhost pada simulator Android yang dibuat dengan AVD, mengganti localhost dengan 10.0.2.2 memecahkan masalah bagi saya.

Punya mereka?

ini bekerja untuk saya. Saya menggunakan MAC
https://stackoverflow.com/a/53617769/5708097

masalah serupa di sini, semuanya berfungsi temukan dengan iOS, Android tidak bisa berfungsi!
saya membandingkan semua konfigurasi permintaan antara iOS dan Android, persis sama!
android selalu mengembalikan halaman login kepada saya, bahkan ketika saya telah membuat hardcode header cookie.

Masalah yang sama di sini. Saya sudah menggunakan 10.0.02 , dan panggilan saya yang sebenarnya terjadi (itu mengirim email), tetapi merespons kesalahan (??).

.post(`/sendMail`, null, {
      params: {
        mail,
      },
    })
    .then(response => response) // No output
    .catch(error => {
      console.log(error); // ERROR : Network Error
      return error.response; // undefined
    });

Setelah mencari, masalah ini tampaknya hanya terjadi ketika saya memperbarui tabel di DB saya. Yang paling aneh adalah pembaruan saya benar-benar terjadi seperti yang diprogram. Hanya ada... Tidak ada respon.

(Maaf double post)

Saya baru saja membuka topik StackOverFlow di mana saya mencoba lebih tepatnya, ini dia: https://stackoverflow.com/questions/54108848/network-error-with-axios-and-Android-emulator

Saya sampai pada masalah ini karena saya mengalami gejala yang persis sama. Jadi ini mungkin informasi yang berguna bagi seseorang. Saya baru menggunakan Emulator Android, jadi saya terkejut permintaannya, yang berfungsi untuk iOS akan gagal di Emulator Android. Ternyata server saya, yaitu https, tidak ditandatangani sendiri memiliki masalah dan memerlukan instal ulang dan karena itu tidak melakukan handshaking SSL dengan benar, yang berarti saya juga mendapatkan Kesalahan Jaringan yang sama yang diposting di awal posting ini.

Saya akan menyarankan 100% mengonfirmasi sertifikat diinstal dengan benar, mendapatkan laporan misalnya dari sslshopper - Semoga ini dapat membantu seseorang 👍

masalah yang sama, ini berfungsi dengan baik di ios, tetapi dapatkan

Jika Anda mencoba memanggil localhost pada simulator Android yang dibuat dengan AVD, mengganti localhost dengan 10.0.2.2 memecahkan masalah bagi saya.

file host lokal yang dimodifikasi

Permintaan GET saya menggunakan Cordova kembali dengan Error: Network error di Android, tetapi berfungsi dengan baik di browser dan di emulator iOS dan perangkat fisik iOS. Permintaan GET saya adalah:

this.axios.get('http://jsonplaceholder.typicode.com/posts/')
      .then(function(response) {
        self.tomData = response
      })
      .catch(function(error) {
        self.error = true
        self.errorText = error
      })

Dan saya menggunakan Cordova 8.0.0. Saya sudah mencoba HTTPS & HTTP, saya sudah mencoba domain yang berbeda juga.

Apa yang berhasil bagi saya adalah alih-alih menggunakan https:// Saya menggunakan http:// untuk emulator Android. Untuk iOS http:// tidak berfungsi sementara https:// tidak.

Apa yang berhasil bagi saya adalah alih-alih menggunakan https:// Saya menggunakan http:// untuk emulator Android. Untuk iOS http:// tidak berfungsi sementara https:// tidak.

Ini bukan solusi jika saya hanya memiliki satu domain https.

Itu berhasil untuk saya.

  1. Matikan Wifi PC
  2. Tutup emulator dan hapus data.
  3. Mulai emulator
  4. Nyalakan lalu PC Wifi

tajuk saya:

headers: {
    'Accept: 'application/json',
    'Content-Type': 'application/json; charset=utf-8'
}

Saya memiliki aplikasi pengujian yang backend-nya dilakukan di Adonis (lokal) dan reaksi-asli depan dan aksio, untuk menunjukkan mendapatkan API, tetapi dalam emulasi itu menyajikan kesalahan berikut:
Kemungkinan Penolakan Janji yang Tidak Tertangani (id: 0):
Kesalahan: Kesalahan Jaringan
Kesalahan: Kesalahan Jaringan ...,
di insonima itu berfungsi normal dengan metode GET, POST, DELETE ...
seseorang bisa membantu.

```import React, { Komponen } dari 'react';
impor {

Tombol
} dari 'react-native';

impor Axios dari 'axios'
class App memperluas Komponen {
handleShowDB = asinkron () => {
const DB = menunggu Axios.get('http://127.0.0.1:3333/users/getuser/1')
konsol.log(DB)

}
render() {
kembali (

Setidaknya bagi saya, yang memiliki api yang dijalankan secara lokal oleh "Adonis", saya memasukkan alamat berikut di emulator Android saya, yang berbeda dari alamat yang digunakan oleh komputer.

/* Endereços para cada emulador/simulador:
* Genymotion: http://10.0.3.2 :3333/* Emulator Android Studio: http://10.0.2.2 :3333/
** Simulador IOS: http://localhost :3333/

https://blog.rocketseat.com.br/react-native-autenticacao/

Itu berhasil untuk saya.

  1. Matikan Wifi PC
  2. Tutup emulator dan hapus data.
  3. Mulai emulator
  4. Nyalakan lalu PC Wifi

tajuk saya:

headers: {
  'Accept: 'application/json',
  'Content-Type': 'application/json; charset=utf-8'
}

OMG, Anda telah menghemat waktu saya bro!

Tidak ada yang berhasil.
Apakah ada solusi untuk ini?

Apa kesalahannya?

Halo @ helloitsm3 , Baru saja perbaiki ini. Mengalami kesalahan yang sama dengan judul masalah ini.
Tetapi memperbaikinya dengan mengganti localhost dengan 10.0.2.2 dan memastikan bahwa data aktif di simulator Android.

Jika Anda mencoba memanggil localhost pada simulator Android yang dibuat dengan AVD, mengganti localhost dengan 10.0.2.2 memecahkan masalah bagi saya.

Saya sangat kecewa ketika itu berhasil.

Untuk siapa pun yang menghadapi masalah di Android 9, cukup tambahkan android:usesCleartextTraffic="true" ke application tag di AndroidManifest.xml Anda.

Saya membaca semua jawaban di atas dan hanya menambahkan apa yang berhasil untuk saya.

@yasirlateef http permintaan dinonaktifkan secara default di Android 9 atau lebih tinggi

bendera ini android:usesCleartextTraffic="true" aktifkan http

https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic

apakah ada yang harus dilakukan di ujung axios?

apakah ada yang harus dilakukan di ujung axios?

Tidak ada yang bisa dilakukan di ujung Axios. Yang harus Anda lakukan adalah menggunakan alamat ip alih-alih localhost dan itu akan berfungsi

sepertinya "masalah pengambilan" yang saya temui di React Native khusus untuk Android 7.0.
Alasannya adalah menggunakan sertifikat yang ditandatangani sendiri

Ini bisa menjadi masalah

Sepertinya masalahnya terkait dengan beberapa pengaturan Android. Jika ada sesuatu yang harus diperbaiki oleh axios, jangan ragu untuk membuka masalah.

@ghost Sangat benar, 200% Benar

  1. ubah dari localhost ke ip Anda
  2. tambahkan http://

http://192.168.43.49 :3000/pengguna/

Kasing saya berfungsi dengan mengubah localhost dengan ip mesin di panggilan api

Saya memiliki masalah serupa dengan situs web saya yang dihosting di AWS EC2 berfungsi dengan baik di browser desktop, tetapi tidak mengambil data dari database melalui API (dihosting juga di sana). Saya mencoba mengambilnya melalui http://localhost/api/... dan itu berfungsi dengan baik di desktop, tetapi untuk beberapa alasan itu tidak ada di browser Android apa pun (mencoba pada perangkat yang sebenarnya, saya tidak menginstal Android Studio). Itu memberi saya Kesalahan Jaringan (saya mengetahuinya melalui log logcat).

Seseorang di sini merekomendasikan untuk mengubah localhost ke alamat IP server yang sebenarnya, meskipun itu berfungsi dengan baik di desktop, jadi saya mencoba mengubah URL menjadi http://PUBLIC_IP_ADDRESS/api/... dan berhasil! Meskipun, saya tidak senang dengan solusi ini, itu satu-satunya cara kerjanya. Semoga ini bisa membantu seseorang.

  1. ubah dari localhost ke ip Anda
  2. tambahkan http://

http://192.168.43.49 :3000/pengguna/

dan :
simpan Perangkat (atau emulator) dan sistem Anda di jaringan yang sama

Jika Anda memiliki kemewahan untuk meningkatkan ke versi Android yang lebih baru, saya telah melakukan tes berikut:
Emulator Api24 tidak berfungsi
Emulator Api25 tidak berfungsi
Emulator Api26 berfungsi!

Saya belum mencoba versi yang lebih baru (kecuali pada ponsel fisik (Android 10)) yang juga berfungsi.

@hantu

Saya telah menghapusnya dan memasukkan bidang gambar sebagai param dengan menetapkan image.uri ke nilai param kemudian berfungsi.

Bisakah Anda memberi tahu saya cara melakukannya secara detail?
Masalah yang sama persis untuk saya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat