/ / API (REST) ​​Filtern von Tabellennamen, komplexen Abfragen - PHP, Android, API, Rest, http

API (REST) ​​Filtern von Tabellennamen, komplexen Abfragen - PHP, Android, API, Rest, http

Ich erstelle eine API zum Konsumieren (für diese Zeit) von mobilen Clients für Android und iOS. Hauptanwendung ist eine Art E-Store.

ich habe news Endpunkt, betrachten wir zum Beispiel die Haupt-URL http://consumer.com/api/v0/

Derzeit habe ich solche Endpunkte, um Nachrichten zu filtern /news?actual=1&moderation=1 ....

Einfache Anordnung von GET Argumente, aber ich habe einige Fragen dazu. Das Schlimme (ich denke schon) ist, dass Filterparameter (actual,moderation) sind die gleichen wie Spaltennamen in der Datenbank.

  1. Ist es eine schlechte Idee, echte Spaltennamen verfügbar zu machen?
  2. Wie kann ich das Problem lösen? Ich habe eine Idee, eine Middleware einzuführen (es ist sowieso möglich, aber ich verwende Lumen, es ist eine große Möglichkeit), die zum Beispiel einige gefälschte Namen übersetzt filter_actual und filter_mooderation Bei echten Tabellennamen wird dies meine App jetzt nicht bremsen. Fügen Sie einfach eine weitere Ebene hinzu (Power of Middleware). Oder es gibt einen anderen Weg, dies zu tun.

Das Hauptproblem ist jedoch, dass Sie das nächste Beispiel in Betracht ziehen, wenn ich eine komplexe Abfrage durchführen muss.

Tabelle news hat Spalte company_id, company Tabelle hat Spalte blockedIn dieser Spalte wird beschrieben, ob das Unternehmen gesperrt ist oder nicht.

Ich muss alle Nachrichten von Unternehmen erhalten, die nicht blockiert sind. Ich habe so etwas wie diese Pseudoabfrage durchgeführt SELECT * FROM news WHERE company_id IN (SELECT id FROM companies WHERE blocked=0) (Ich habe nicht nachgesehen, aber ich hoffe du hast eine Idee)

Wie man einen Endpunktfilter für diese Art von Abfrage erstellt, habe ich jetzt zusätzliche Optionen wie eingeführt non_blocked_companies und dann mit anderen Filtern weitergeben /news?actual=1&moderation=1&non_blocked_companies=1 und dann überprüfen Sie, ob dieser Parameter mit anderen übergeben wurde, damit er im Code bald wie eine Menge aussehen kann if Anweisungen, die für jede komplexe Abfrage spezifisch sind.

Ich habe über solche Fragen nachgedacht /news?actual=1&moderation=1&blocked[companies:company_id]=0 Ich denke es ist klar. Ich benutze ein Feld aus einer anderen Tabelle (companies) eine Spalte in news Tabelle (company_id) welche ID der Firma speichert.

Aber es sieht für mich erstens hässlich aus, weil es so istziemlich komplexe Abfrage in get request, aber die größte schlechte Seite davon ist für mich, dass ich den Tabellennamen und die Tabellenspalten genau kennen muss. Dies ist jetzt nicht das Problem, da diese API nur für die Kommunikation mit mobilen Clients verwendet wird und nicht funktioniert öffentlich geöffnet werden, aber ich möchte trotzdem zuverlässige APIs erstellen

  1. Ist es eine schlechte Idee, wie ich sie früher beschrieben habe?
  2. Wie kann ich meine API flexibel organisieren (Änderungen an der API sollten das Frontend so wenig wie möglich beeinflussen)?

Bitte, fortgeschrittenere API-Entwickler, schlagen vor, was in meinem Fall die beste Wahl ist.

Vielen Dank.

Antworten:

1 für die Antwort № 1

Ist es eine schlechte Idee, echte Spaltennamen verfügbar zu machen?

Ist ist keine schlechte Idee. Für Entwickler ist es gut zu verstehen, was genau passiert. Ich würde den Eigennamen eher als direkten Spaltennamen angeben. Es gibt viele APIs von Amazon und Google machen dasselbe.

Wie kann ich das Problem lösen? Ich habe eine Idee, eine Middleware einzuführen (es ist sowieso möglich, aber ich verwende Lumen, es ist eine großartige Möglichkeit), die einige gefälschte Namen wie filter_actual und filter_mooderation in echte Tabellennamen übersetzt. Dies wird meine App jetzt nicht bremsen. Fügen Sie einfach hinzu eine weitere Schicht (Macht der Mittelware). Oder es gibt einen anderen Weg, dies zu tun.

Oftmals möchte der Entwickler keine Nachricht senden. Wenn Sie der Meinung sind, dass dies komplexer ist und die Anwendung unterbrochen wird, würde ich dies vorschlagen. Hier finden Sie eine ausführliche Diskussion, bevor Sie Ihren Anruf tätigen HTTP GET mit Anforderungshauptteil

Sie können viele Überprüfungen hinzufügen, um die API zu stärken und unterschiedliche Anforderungsszenarien zu verarbeiten.