Rest API - PHP?
Hey, ich habe eine locale MySQL Datenbank, nun möchte ich diese an meine App anbinden. Dazu ist es sinnvoll eine Rest API zu entwickeln. Ich habe es mit folgender Anleitung versucht:
https://code.tutsplus.com/tutorials/how-to-build-a-simple-rest-api-in-php--cms-37000
Jedoch funktioniert es nicht. Also ich kann die API im Browser und mit Postman abrufen. Aber in meiner App kann ich trotz richtiger Anbindung keine Daten ausgeben.
Hat jemand eine Idee woran es liegen kann?
Danke schonmal für die Hilfe!
Bekommst du eine Fehlermeldung oder ähnliches?
Nein, bekomm nur so ein Ladezeichen, das hab ich so programmiert das es das macht, das heißt das er keine Daten bekommt, aber mit einer API aus dem Internet funktioniert es
Hast Du denn einen Response Code. Oder wird überhaupt nichts zurückgegeben?
Ja hab ich aber ist zu lang, kann das hier nicht posten
4 Antworten
Der mögliche Grund wegen nur http (nicht verschlüsselt) sollte kein Problem sein. Ich habe schon über HTTP Requests gemacht und es ging durch. Ausnahme könnte sein, wenn Google in der letzten Version etwas verändert hat.
Da deine App auf einem Smartphone läuft und dein Server auf deinem PC läuft, ist das Netzwerk auch ein Thema.
Hast du in der App deine lokale IP Adresse vom PC angegeben? localhost oder 127.0.0.1 passt nicht.
Blockst du über dein Router oder über die Windows Firewall die Verbindung? Falls du keine Ahnung hast, wird es eher nicht der Fall sein.
Es könnte auch sein, dass dein Service nur auf localhost lauscht und daher nicht von außerhalb erreichbar ist. Was ist wenn du in z.B. Postman die lokale IP vom PC benutzt?
Nutzt ein Debug oder Release Build der Flutter App? Bei einem Release Build musst du noch eine Berechtigtungen zur AndroidManifest.xml hinzufügen. Im Debug Build wurde es schon hinzugefügt, da es u.A. für die DevTools erforderlich ist.
Infos dazu: https://stackoverflow.com/a/55606098
Du könntest auch testweise deine API über den Browser am Smartphone aufrufen. Dann hast den Teil mit Netzwerk dabei, aber deine App ist außen vor.
Andersherum könntest du den Android Emulator nutzen, um deine Anwendung ohne Netzwerk zu testen. Ich würde den Android Emulator nutzen, da du hier dann auch die Android Plattform nutzt.
Welche Informationen bekommst du beim Aufruf in der App? Hier bietet sich an, die App mit Debugging zu starten und ein Breakpoint zu setzen. Wirt eine Exception geworfen? Was beinhaltet das Response Objekt? Status Code? Header? Payload?
Vielleicht liegt es ja an einer Firewall, die verhindert, dass du die API von einem anderen Gerät aus aufrufen kannst.
Versuch mal die API mit einem Browser oder Postman aufzurufen und verwende dabei ein anderes Gerät als das, auf dem die API läuft.
ja, hab sie aber auf einem smartphone laufen
Ich glaube in diesem Fall ist die App nicht wirklich lokal.
Was für eine IP-Adresse rufst du denn in der App auf? (localhost/127.0.0.1 wird vermutlich nicht funktionieren).
Und kannst du http://ipvonPC/link/zur/api auf einem anderen Gerät aufrufen als deinem lokalen PC, auf dem diese API auch läuft?
vll liegt das wirklich daran das es http ist aber weiß auch nicht
Wenn es im Browser und über einen REST Client wie Postman funktioniert, aber über die App nicht, ist wohl weniger die API das Problem, sondern die App. Daher müsstest du schon näher darauf eingehen, mit was die App entwickelt wurde und wie sie die API aufruft. Fehlermeldungen wären auch sinnvoll.
Ruft die App die API über HTTP (und nicht HTTPS) auf? Dann ist das nämlich wahrscheinlich das Fehlerbild. Dazu ein Auszug aus der (beispielhaften) React Native Dokumentation:
By default, iOS will block any request that's not encrypted using SSL. If you need to fetch from a cleartext URL (one that begins with http) you will first need to add an App Transport Security exception.
[...]
On Android, as of API Level 28, clear text traffic is also blocked by default. This behaviour can be overridden by setting android:usesCleartextTraffic in the app manifest file.
https://reactnative.dev/docs/network.html
Ansonsten benötigt man hier wie gesagt schon ein wenig mehr Kontext wie Fehlermeldungen, da das sonst Blindraten ist.
und wie kann ich android:usesCleartextTraffic im Manifest setzen bzw einstellen?
Kenne mich mit Flutter nicht aus (nur React Native). Hier aber eine StackOverflow Antwort dazu: https://stackoverflow.com/a/60192032/8159153
Die Alternative wäre halt, dass du deine API mit HTTPS verschlüsselst. Am einfachsten geht das mit etwas wie Ngrok, welches dir eine zufällig erzeugte) HTTPS-verschlüsselte Domain gibt, welche du auf deine API auf localhost weiterleiten kannst. So musst du dich nicht selbst um den SSL-Kram kümmern. Ngrok hat eine große Dokumentation, gibt's aber auch sonstige Anleitungen im Netz.
Hab es probiert, aber wenn ich ngrok http 80 eingebe dann wird ja die standard seite in https übersetzt. Wie kann ich das machen das ich eine beliebige url in https übersetzen kann?
Habe es schon, aber ändert an der Funktionalität auch nichts
aber kann man es auch statisch machen, weil die url sonst jedesmal anders ist wenn man einen tunnel beendet
Ja also ich habe es mit einer API aus dem Internet probiert und da funktioniert es. Ich rufe die API mit http auf. Die App wird mit Flutter programmiert und ich bekomme keine Fehlermeldung. Es kommt nur das Ladezeichen, weil ich das so programmiert habe
Wo läuft denn dein Server mit der REST-API und wo läuft die App?
Wenn der Server auf einem lokalen Rechner läuft und die App auf dem Smartphone, dann musst du im Smartphone die richtige – lokale – IP-Adresse des Rechners eintragen und selbst dann kann es sein, dass dein Router die Verbindung blockiert.
Ja also die API läuft lokal und die App eigentlich auch, nur ich hab ein Smartphone per USB angeschlossen und diese läuft auf dem Smartphone
Na ja, dann läuft die App wie ich mir schon dachte auf dem Smartphone. Hast du in dem App auf dem Smartphone die richtige IP-Adresse eingegeben?
Na dann höre auf das was ich dir gesagt habe und gibt die lokale IP-Adresse deines Rechners an. Dein Smartphone kann link nicht auflösen, sofern du das nicht einen lokalen DNS hast.
das ist der link zu meiner api und so hab ich das auch in meiner app stehen
Es hätte einiges Zeit gespart, wenn du das gleich geschrieben hättest. Ich habe keine Glaskugel, die mir sagt, dass du ngrok nutzt.
Wenn der Link funktioniert und deine Ali ok ist, dann liegt der Fehler in den App. Da musst du halt mal Debugger und schauen, warum die Daten nicht geladen werden.
Ja der link funktioniert im Browser, also auch vom Smartphone und mit postman kann ich die Daten ebenfalls abfragen
ich weiß woran es liegt, es liegt an den Datentypen aber weiß nicht wie ich das lösen kann
Die Api läuft ja local