Ich arbeite an einem neuen iOS-App-Projekt auf der mobilen Seite. Es gibt einige Architekturänderungen und es stellt sich heraus, dass wir uns auf eine benutzerdefinierte private API stützen müssen, die von der App, die wir erstellen, und auch von anderen Clients wie einer Website verwendet wird.
Die API, die entworfen wird, folgt dem Rest-Stil von ressourcenzentrierten URI- und CRUD-Operationen, die HTTP-Verben zugeordnet sind. Dinge wie:
GET www.example.com/books
DELETE www.example.com/books/482094
POST www.example.com/users/6793
Das Problem ist, dass dieser Stil häufig dazu führt, dass der mobile Client viele Anforderungen zum Laden eines einzelnen App-Bildschirms oder zum Verwalten einer einzelnen Benutzeroberflächenaktion ausführen muss. Dies führt dazu, dass sich die App 8 Sekunden lang im Lademodus befindet, bis sie alles Nötige hat. Eine langsame und nicht reagierende App.
Mobile Clients haben gravierende Einschränkungen in Bezug auf die Konnektivität. Daher sollten wir im Idealfall diese Art von Regel befolgen:
1 Bildschirm == 1 API-Aufruf
1 save == 1 API-Aufruf.
Es gibt viele Situationen, in denen Sie auf einen Kollisionskurs mit den REST-Konstruktionsprinzipien gebracht werden, zum Beispiel:
- Nehmen wir an, Ihre App ist seit einem Tag offline und Sie müssen mit vier Tabellen der Back-End-Datenbanken synchronisieren und benötigen einen Anruf wie
www.example.com/sync_everything?since=2015-07-24
- Nehmen wir an, es gibt einen Bildschirm, auf dem der Benutzer viele seiner Objekte bearbeiten kann, zum Beispiel Aufgaben in seiner Aufgabenliste ankreuzen kann. Es sollte eine Möglichkeit geben, alle diese Aufgabendatensätze in einem einzigen Stapel-API-Aufruf zu bearbeiten, anstatt nur einen API-Aufruf pro Bearbeitung.
- Nehmen wir an, es gibt einen Bildschirm, der Informationen aus den DB-Tabellen ORDER, SALESMEN und PRODUCT mischt. Ich sollte diese Daten in einem Aufruf anstelle von drei abrufen.
Das Risiko ist, dass wir möglicherweise die restloseste API und die nutzloseste nicht reagierende mobile App haben, die es gibt.
Die Sache ist, ich bin nur ein neuer Auftragnehmer dort und was ich brauche, ist etwas, das mir dabei hilft, diese Punkte zu verdeutlichen, einige Artikel aus angesehenen Quellen oder ähnliches. Hauptakteure, die für ihren mobilen Client Kompromisse mit dem REST-Stil eingehen (z. B .: Verwendung von Endpunkten mit zusammengesetzten API-Aggregaten).
Oder irgendeine Lösung für dieses allgemeine Problem. Vielen Dank!
Antworten:
Dies ist genau hier Ihr Problem.
Sie haben Ihre Ressourcen auf die Modelle in Ihrer Datenbank beschränkt (ich gehe davon aus). Das Laden all dieser Ressourcen nimmt daher einige Zeit in Anspruch, da auf Ihrem Server kein Konzept für Ressourcen vorhanden ist, für die in der Datenbank keine Repräsentation vorhanden ist.
Zum Beispiel könnte haben
Das alles muss geladen werden, um meine Bibliothek zu bekommen
Dies ist kein Problem mit RESTful-Design, sondern ein REST-Anti-Pattern. Es gibt absolut nichts in REST, was besagt, dass unsere Ressourcen eine Eins-zu-Eins-Zuordnung zu irgendetwas anderem in Ihrem System haben müssen, einschließlich Datenbankmodellen.
Die Lösung besteht darin, mehr Ressourcen zu erstellen, die besser zu dem passen, was Sie laden möchten. Wenn Sie 5 Ressourcen haben, die immer zusammen enden, erstellen Sie eine neue Ressource, die die Informationen für diese 5 Ressourcen enthält.
Was Sie haben sollten, ist so etwas
das lädt nur alle Bücher für diesen Benutzer. "my_library" ist kein Modell in Ihrer Datenbank, aber es ist eine Ressource. Der Server erstellt es basierend auf Modellen in der Datenbank, es gibt jedoch keine 1-zu-1-Zuordnung, und der Server verfügt über die Flexibilität, diese Ressource zu erstellen, ohne das DB-Modell zu ändern.
Sie könnten auch haben
Keines davon muss als Modell in Ihrer Datenbank oder Ihrem Domänenbereich vorhanden sein.
Es gibt ein weit verbreitetes Missverständnis, dass dies die falsche Vorgehensweise ist, da Frameworks wie Rails die Zuordnung von Ressourcen zu Modellen im Domänenbereich, die wiederum 1 zu 1 mit Datenbankzeilen zugeordnet sind, im Verhältnis 1 zu 1 lehrten. Dies ist weder notwendig noch wird es empfohlen.
Die Ressourcen sollten zahlreich, billig und leicht sein . Es sollte einfach sein, sie zu erstellen, und sie sollten von Ihrem Domain-Modell abstrahiert sein. Wenn Sie einen neuen benötigen, erstellen Sie einfach einen neuen. Wenn Sie Probleme damit haben, liegt es nicht an REST, sondern an Ihrem Framework.
Die große Einschränkung dabei ist natürlich, ob Ihr Framework dies zulässt. Frameworks wie Rails und Django, die den Kurs zur 1-zu-1-Zuordnung absolviert haben, um "Zeit zu sparen", erschweren dies. Aber das ist ein Fehler bei den Frameworks, nicht bei RESTful Design.
Hier ist Jim Webber, der dies ausführlicher bespricht (einschließlich einiger Grabungen bei Rails auch!)
https://yow.eventer.com/yow-2011-1004/domain-driven-design-for-restful-systems-by-jim-webber-1047
quelle