webentwicklung-frage-antwort-db.com.de

Reagieren einer systemeigenen Postanforderung über Abruf wirft fehlgeschlagene Netzwerkanforderung

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.

29
arnebr

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

8
Antonio

Entwickeln mit integriertem Windows OS/PHP-Server/reaktativem Android auf dem Gerät:

  • Überprüfen Sie die lokale IP-Adresse des Servers (ipconfig), z. 172.16.0.10
  • verwenden Sie diese URL und den richtigen Port in reaktiver fetch (fetch('http://172.16.0.10:8000/api/foo))
  • führen Sie den eingebauten Server PHP mit dieser spezifischen IP-Adresse anstelle des localhost aus: php -S 172.16.0.10:8000 ...
  • deaktivieren Sie die Windows-Firewall für private Netzwerke

Das Verbindungsproblem zwischen dem Android-Handy und dem lokalen Server wurde für mich behoben.

12
mp31415

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

4
Stephen King

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.

0
iuliu.net

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.

0
bcr

Überprüfen Sie zwei Fälle unten

  1. Falscher Endpunkt
  2. Internetverbindung: sowohl reales Gerät als auch virtuelles Gerät

Es hat 2 Stunden mit dem zweiten Grund gegessen.

0
Tuan Nguyen

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)
            })
    };
};
0
tlagreca