Сбой сетевого запроса на устройстве iOS ||React-Native ||Экспо - PullRequest
1 голос
/ 11 июля 2019

Что я хотел бы сделать:

Я пытаюсь отправить запрос в мой API (созданный с помощью ApiPlatform) локально в моем приложении React Native с моим устройством ios на выставке.Может кто-нибудь знает, как это исправить?:)

Вот запрос, который я хочу сделать: "http://127.0.0.1:8000/api/beers"

Что работает:

Мой запрос работает на моем компьютере

Мой запросработает на моем эмуляторе Android, набрав: "http://10.0.2.2:8000/api/beers"

Что я сделал:

Для устройства ios на выставке я прочитал, что мне нужно изменить 127.0.0.1: 8000 по Ipv4 моего компьютера, поэтому я запустил

ipconfig

в powershell и, получив свой адрес Ipv4, вставил в мой запрос: "http://172.20.10.2:8000/api/beers"

Я прочиталчто IOS не разрешает протокол HTTP, поэтому я добавляю в мой app.json -> infoPlist -> NSAppTransportSecurity -> true

    "ios": {
      "supportsTablet": true,
      "infoPlist": {
        "NSAppTransportSecurity" : {
          "NSAllowsArbitraryLoads" : true,
        }
      }
    }

. Как и все другие темы, но всегда та же ошибка: "Сбой сетевого запроса "

Я подключен к одной и той же сети в обоих (устройство iOS и эмулятор Android).

Я пробовал" https://anapioficeandfire.com/api/characters/583", например, и этоработает на моем эмуляторе и на моем устройстве iOS.

Я использую другой API, но он запускается через 'https'.Здесь проблема, кажется, 'http'.

Однако я попытался исправить это, добавив «NSAppTransportSecurity»: «true» в infoPlist в app.json, но ничего не изменилось.Как я уже сказал на верхнем.

Я также пытался подключиться к Интернету в другом доме, изменить IPv4.Но все же проблема.

Я не вижу другого способа это исправить.Я, наверное, что-то упускаю.

Вот функция, разрешающая запрос

export function getsBeersFromRatio(){
    const url = Platform.OS === 'android'? 'http://10.0.2.2:8000/api/beers?abv%5Bgte%5D=6.2' : 'http://172.20.10.2:8000/api/beers'
    return fetch(url)
        .then((response) => response.json())
        .catch((error) => console.log(error));
}


  _searchBeersFromRatio(){
    this.setState({
      beers: [],
    },
    () => {
      this._loadBeersFromRatio()
    })
  }



  _loadBeersFromRatio(){
    console.log('====================================');
    console.log('       NEW REQUEST                   ');
    console.log('====================================');
    this.setState({ isLoading: true })
    getsBeersFromRatio().then(data => {
      console.log(data);

    })
  }


    <Button
      title = "get data from API"
      onPress = {() => this._searchBeersFromRatio()}
    />

Здесь мой package.json:

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject",
    "postinstall": "node ./scripts/stfu.js"
  },
  "dependencies": {
    "country-list": "^2.1.1",
    "expo": "^33.0.0",
    "react": "16.8.3",
    "react-dom": "^16.8.6",
    "react-native": "https://github.com/expo/react-native/archive/sdk-33.0.0.tar.gz",
    "react-native-chart-kit": "^2.6.1",
    "react-native-elements": "^1.1.0",
    "react-native-flags": "^1.0.0",
    "react-native-redash": "^6.3.1",
    "react-native-view-more-text": "^2.1.0",
    "react-native-web": "^0.11.4",
    "react-navigation": "^3.11.0",
    "react-redux": "^7.1.0",
    "redux": "^4.0.1",
    "rn-vertical-slider": "^1.0.4",
    "victory-native": "^32.0.2"
  },
  "devDependencies": {
    "babel-preset-expo": "^5.1.1"
  },
  "private": true
}

Вот мой app.json

{
  "expo": {
    "name": "BierRatio",
    "slug": "BierRatio",
    "privacy": "public",
    "sdkVersion": "33.0.0",
    "platforms": [
      "ios",
      "android",
      "web"
    ],
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "ios": {
      "supportsTablet": true,
      "infoPlist": {
        "NSAppTransportSecurity" : {
          "NSAllowsArbitraryLoads" : true,
        }
      }
    }
  }
}

Ожидаемое поведение

Я ожидаю того же журнала, что и мой эмулятор Android

Фактическое поведение

Фактический вывод «Сетевой запрос не выполнен»

Спасибо!

1 Ответ

0 голосов
/ 15 июля 2019

Обходной путь:

Я наконец нашел рабочее слово:

Когда я набрал http://"My_IPv4_address":8000/"My_Api" на моем компьютере, он сказал: "ERR_CONNECTION_REFUSED"

Итак, я попытался запустить $ php bin / console server: запустите "My_IPv4_address": 8000

Мне показывается уведомление брандмауэра, я принимаю его.Я снова отправляю свой запрос на моем устройстве iOS, и я не знаю, почему он работает сейчас.

Поэтому мне нужно запустить

$ php bin / console server: запустить

и в другом PowerShell

$ php bin / console server: запустите "My_IPv4_address": 8000

, чтобы получить доступ к моему локальному APIв моем эмуляторе Android и устройстве iOS.

...