Ich bin auf folgenden Fehler gestoßen. Im Moment entwickle ich eine Android-App mit React Native. Daher plane ich, fetch für eine Post-Anfrage für mich zu verwenden.
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);
})
;
Die App löst jetzt einen Fehler aus:
TypeError: Netzwerkanforderung fehlgeschlagen
Wenn ich den Code in einen GET-Request umwandle, funktioniert das einwandfrei. Im Browser mit einem window.alert () als Rückgabe ist es cool und auch die Chrome-Erweiterung Postman liefert die Daten korrekt.
Dieser Fehler von React Native ist eher unbrauchbar, daher müssen Sie zuerst den tatsächlichen zugrunde liegenden Fehler ermitteln. Am einfachsten ist es, ein kleines natives Programm zu schreiben, das dieselbe Abfrage mit HttpsURLConnection
ausführt.
Für mich war der eigentliche Fehler Java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
, Der eine bekannte Lösung hat: https://developer.Android.com/training/articles/security-ssl.html#MissingCa
Dies ist wahrscheinlich auch der Fall, da Browser und Postman kein Problem mit der Anfrage haben. Um dies zu überprüfen, führen Sie openssl s_client -connect XXreachable-domainXX.de:443 -showcerts
aus. Wenn Zertifikatfehler auftreten, beheben Sie sie zuerst. Dadurch können Sie Zeit für das Schreiben des nativen Programms sparen.
Edit: Eigentlich ist der einfachste Weg, alle zugrundeliegenden Android-Fehler für Reactative zu sehen, einfach 'adb logcat' im Terminal auszuführen
Entwickeln mit integriertem Windows OS/PHP-Server/reaktativem Android auf dem Gerät:
ipconfig
), z. 172.16.0.10fetch
(fetch('http://172.16.0.10:8000/api/foo)
)php -S 172.16.0.10:8000 ...
Das Verbindungsproblem zwischen dem Android-Handy und dem lokalen Server wurde für mich behoben.
Wenn Sie diesen Fehler hatten und Sie sicher sind, dass alles gut funktioniert und Sie einen Emulator ausführen, schließen Sie einfach Ihren Emulator und starten Sie ihn erneut.
Es sollte jetzt laufen.
Dies geschieht normalerweise, nachdem Sie Ihr System für eine Weile in den Ruhezustand versetzt haben
Wenn Sie dieses Problem im Emulator haben, stellen Sie sicher, dass Sie es auch auf dem Gerät testen. Dort passiert es höchstwahrscheinlich nicht.
Nur damit Sie wissen, dass Sie sich keine Sorgen machen müssen, wenn Sie sich darum kümmern können.
Ich hatte dieses Problem auf Android aufgrund eines abgelaufenen Zertifikats. Die Fehlermeldung, die ich hatte, war 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)
.
Ich konnte dies mit digicert.com bestätigen.
Leider musste ich ziemlich tief in den React Native-Code eintauchen und den XHR-Code im Bundle (index.Android.bundle)
debuggen, um die Fehlermeldung und die fragliche URL zu finden, da er in meinem Protokollierungscode enthalten war. Melden Sie sich auch bei der Konsole an. :)
Mir wurde von diesem GitHub-Ausgabekommentar geholfen.
Überprüfen Sie zwei Fälle unten
Es hat 2 Stunden mit dem zweiten Grund gegessen.
Ich hatte ein großes Problem damit, das gleiche auf dem Android-Emulator zu machen. Unter iOS war die Genehmigung der Domäne in der info.plist erforderlich. Um klar zu sein, habe ich versucht, mich bei meiner .NET-gehosteten API anzumelden.
Die Lösung bestand darin, sicherzustellen, dass die Post-Daten parametrisiert wurden.
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)
})
};
};