2015-11-14 5 views
13

Ich verwende die Fetch-API in meiner reagierenden nativen Android-App, um Anfragen an eine lokale API zu senden. Normalerweise frage ich diese API von react Web-Apps unter http://localhost:8163.Reactive Native Android Fetch bei Verbindung mit lokaler API fehlgeschlagen

Ich teste meine App auf meinem physischen Gerät im Debugger-Modus. Ich habe irgendwo gelesen, dass reactive-native localhost nicht wie eine Web-App abfragen kann. Anscheinend müssen Sie http://10.0.2.2:[PORT_NUMBER_HERE]/ verwenden, das ein Alias ​​für `http://127.0.0.1:[PORT_NUMBER_HERE] entsprechend den Android-Emulator-Docks ist. Ich bin mir nicht sicher, ob ich das zum Testen auf einem physischen Gerät tun soll.

Mein Code holen sieht wie folgt aus:

fetchToken() { 
    fetch('http://10.0.2.2:8163/extension/auth', { 
     method: 'GET', 
     headers: { 
      'Accept': 'application/json', 
      'Content-type': 'application/json' 
     } 
    }) 
    .then((response)) => console.log('successful fetchToken response: ', response.json())) 
    .catch((error) => console.log('fetchToken error: ', error)) 
    .done(); 
} 

Die Anforderung immer für eine Weile hängt und erreicht dann den catch Block mit dem nicht hilfreich Fehler TypeError: Network request failed(...). Wenn ich die Protokolle für meine lokale API überprüfe, registrieren sie die Anfrage überhaupt nicht.

So habe ich keine Ahnung, ob ich meine lokale API richtig abfragen, um die Ressource zu bekommen, die ich will, und wenn ich bin, weiß ich nicht, warum der Abruf fehlschlägt.

+1

ja, das ist, weil Sie Ihr Android-Emulator eine andere Maschine von Ihrem lokalen dev Computer.Für ein physisches Gerät ist das genau wie beim Testen von einem anderen Computer: Entweder haben Sie ein Namensauflösungssystem oder verwenden Sie die IP-Adresse – njzk2

+0

@ njzk2 Könnten Sie das näher erläutern? Ich habe das gleiche Problem, aber nicht sicher, was meinst du mit einem Namensauflösungssystem? Ich benutze die IP-Adresse meines Computers, wie in der react-native docs .. –

+0

@ Andrea.cabral Namensauflösung wird in der Regel von DNS getan. – njzk2

Antwort

17

Sie können nicht auf Ihren lokalen Entwicklungsserver zugreifen, da dieser Port noch nicht von ADB weitergeleitet wurde. Wenn Sie react-native run-android ausführen, bildet React Native den Port 8081 mit Ihrem mobilen Gerät auf USB ab. Wenn Sie Ihre USB-Verbindung trennen, können Sie Ihren Code nicht mehr aktualisieren oder neu laden. In dieser Situation können Sie also zwei Dinge tun, entweder Ihren lokalen Server-Port zuordnen, so wie React Native funktioniert, oder Ihre lokale IP-Adresse verwenden.

  1. Mapping-Port

    Dies funktioniert nur, wenn Sie Android 6.0+ verwenden. So leiten Sie den folgenden Befehl in das Terminal einen Port mit ADB laufen:

    adb reverse tcp:8163 tcp:8163 
    

    Dies wird Ihre lokale 8163 Port Mobile 8163 Port zuordnen. Auf diese Weise können Sie auf Ihren Entwicklungsserver zugreifen.

  2. lokale IP-Adresse verwenden

    Sie können auch auf der lokalen IP verwenden Reagieren india Entwicklung app sie ohne USB zu laden. Schütteln Sie Ihr Gerät oder drücken Sie lange auf die Menütaste, um das Entwicklermenü zu öffnen. Öffnen Sie Dev Settings und tippen Sie dann auf Debug server host & port for device. Hier können Sie die lokale IP-Adresse Ihres Geräts mit der Portnummer 8081 eingeben. Für Beispiel Wenn die IP-Adresse Ihres Geräts 192.168.1.100 lautet, geben Sie hier 192.168.1.100:8081 ein, um eine erfolgreiche Verbindung herzustellen. Jetzt haben wir gedeckt, dass wir die App neu laden können. Wenn Sie danach den Entwicklungsserver Ihres lokalen Rechners verwenden möchten, verwenden Sie dieselbe IP-Adresse mit der Portnummer Ihres Servers.

Sie sollten gut sein, damit zu gehen.

+0

Sie haben Recht. Eigentlich habe ich es selbst herausgefunden, es fand es so zurückhaltend, zuerst eine Frage zu beantworten und dann zu antworten. – hellogoodnight

+0

:) Selbstlernen ist das beste Lernen. Ich bin froh, dass du es selbst herausgefunden hast. –

+1

vielen Dank dafür! adb reverse hat mich gerettet! Zuerst dachte ich, es wäre ein HTTP-vs-HTTPS-Ding und verbrachte eine lange Zeit damit, herauszufinden, wie ich meine Localhost-API einrichten musste, um HTTPS anstelle von http zu verwenden, es stellte sich heraus, dass dies die ganze Zeit war. Ich weiß nicht, warum ich nicht darüber nachgedacht habe, wie mein Gerät (obwohl es in einem Emulator läuft) standardmäßig keine Verbindung zu localhost: port auf meinem Computer herstellen kann. –

-1

verwenden nur componentDidMount wie folgt aus:

componentDidMount(){ 
    return fetch('http://10.0.2.2:8163/extension/auth') 
     .then((response) => response.json()) 
     .then((responseJson) => { 

      this.setState({ 
       isLoading: false, 
       sem: responseJson 
      }); 
     }) 
     .catch((error) => { 
      console.error(error); 
     }); 
} 

für mehr: https://facebook.github.io/react-native/docs/network.html

+0

können Sie bitte Ihren Code erklären –

Verwandte Themen