Что я хотел бы сделать:
Я пытаюсь отправить запрос в мой 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
Фактическое поведение
Фактический вывод «Сетевой запрос не выполнен»
Спасибо!