Реагировать на запрос собственного сообщения с помощью запроса на извлечение сетевых запросов
Я наткнулся на следующую ошибку.
На данный момент я разрабатываю приложение для Android с React Native, поэтому планирую использовать выборку для выполнения почтового запроса для меня.
fetch("https://XXreachable-domainXX.de/api/test", {
method: "post",
body: JSON.stringify({
param: 'param',
param1: 'param',
})
}
)
.then((response) = > response.json()
)
.
then((responseData) = > {
ToastAndroid.show(
"Response Body -> " + JSON.stringify(responseData.message), ToastAndroid.SHORT
)
})
.
catch((error) = > {
console.warn(error);
})
;
Приложение теперь выдает сообщение об ошибке:
TypeError: сбой сетевого запроса
Когда я меняю код на GET-Request, он работает нормально, в браузере с окном. alert() в качестве возврата он классный, а также расширение chrome Postman правильно возвращает данные.
Ответы
Ответ 1
Эта ошибка React Native довольно бесполезна, поэтому сначала вам нужно получить фактическую основную ошибку. Самый простой способ - написать небольшую собственную программу, которая просто выполнит тот же запрос, используя HttpsURLConnection
.
Для меня фактическая ошибка была java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
который имеет хорошо известное решение: https://developer.android.com/training/articles/security-ssl.html#MissingCa
Это, скорее всего, и ваше дело, учитывая, что браузеры и почтальон не имеют проблем с запросом. Чтобы проверить его, запустите openssl s_client -connect XXreachable-domainXX.de:443 -showcerts
. Если есть ошибки сертификата, исправьте их сначала, это может избавить вас от необходимости писать собственную программу.
Изменить: на самом деле самый простой способ увидеть все основные ошибки android для реакции native - это просто запустить "adb logcat" в терминале
Ответ 2
Разработка с использованием ОС Windows/PHP для встроенного сервера/реагирования на Android на устройстве:
- проверить локальный IP-адрес сервера (
ipconfig
), например. 172.16.0.10
- в native-native
fetch
используйте этот URL-адрес и правильный порт (fetch('http://172.16.0.10:8000/api/foo)
)
- запустите встроенный PHP-сервер с этим конкретным IP-адресом вместо localhost:
php -S 172.16.0.10:8000 ...
- отключить брандмауэр Windows для частных сетей
Это установило проблему соединения между телефоном Android и локальным сервером для меня.
Ответ 3
Если у вас есть эта ошибка, и вы уверены, что все работает хорошо, и вы запускаете эмулятор, просто закройте свой эмулятор и снова запустите его.
Теперь он должен выполняться.
Это обычно происходит после того, как вы немного спятили систему в течение некоторого времени
Ответ 4
У меня была серьезная проблема, делающая то же самое на эмуляторе Android. На iOS одобрение домена в info.plist было необходимо. Чтобы быть ясным, я пытался войти в свой .NET-хостинг API.
Исправлено: убедиться, что данные сообщения были параметризованы (я уверен, что слово)
export const loginUser = ({ userName, password }) => {
const data = `UserName=${userName}&Password=${password}&grant_type=password`
return (dispatch) => {
dispatch({ type: LOGIN_USER })
fetch(URL_LOGIN, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: data
// body: {
// UserName: userName,
// Password: password,
// grant_type: 'password'
// }
})
.then((response) => {
loginUserSuccess(dispatch, response)
})
.catch((response) => {
loginUserFailed(dispatch, response)
})
};
};
Ответ 5
Проверьте два случая ниже
- Неверная конечная точка
- Подключение к Интернету: виртуальное устройство реального времени
Он съел 2 часа со второй причиной.
Ответ 6
Если вы столкнулись с этой проблемой на эмуляторе, убедитесь, что вы также протестировали его на устройстве. Это, скорее всего, не происходит там.
Просто чтобы вы знали, что вам не о чем беспокоиться, если вы можете обойти это.
Ответ 7
У меня была эта проблема на Android из-за сертификата с истекшим сроком действия. Сообщение об ошибке, которое у меня было, было com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate expired at Fri Sep 29 16:33:39 EDT 2017 (compared to Fri Dec 08 14:10:58 EST 2017)
.
Я смог подтвердить это, используя digicert.com.
К сожалению, мне пришлось довольно глубоко копаться в исходном коде React и отлаживать XHR-код в пакете (index.android.bundle)
, чтобы найти сообщение об ошибке и соответствующий URL, потому что это было в каком-то моем коде регистрации, который я, очевидно, тоже не заходил на консоль.:)
Мне помог этот комментарий о выпуске GitHub.