REST-API-Design: Mehrere Aufrufe im Vergleich zu einem einzelnen Aufruf der API

17

Wir entwickeln eine Rest-API für die E-Commerce-Website, die von mobilen Apps genutzt wird.

Auf der Startseite einer App müssen mehrere Ressourcen aufgerufen werden, z. B. Schieberegler, Top-Marken, meistverkaufte Produkte, Trendprodukte usw.

Zwei Optionen zum Ausführen von API-Aufrufen:

Einzelruf:

www.example.com/api/GetAllInHome

Mehrere Anrufe:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

Welches ist der beste Ansatz für das Design von Rest-APIs? Einfacher oder mehrfacher Aufruf, Vor- und Nachteile?

Was wird mehr Zeit in Anspruch nehmen, um auf die Anfrage zu antworten?

shaijut
quelle

Antworten:

14

In der Theorie sind die mehreren gleichzeitigen Anrufe flexibler und genauso schnell.

In der Praxis ist das Ergebnis jedoch langsam und unzusammenhängend, wenn Sie eine Seite laden und dann jeden Teil dieser Seite laden und alle geladenen Drehfelder darauf anzeigen, bis Sie die Ergebnisse zurückerhalten.

Aus diesem Grund sollten AJAX-Datenanforderungen sparsam verwendet werden und nur dann, wenn ein Teil der Seite nur langsam geladen oder in einem anderen Zyklus als der Rest der Seite aktualisiert werden muss. Sagen Sie eine Master- / Detailanzeige, in der Sie eine Option aus dem Master auswählen und das entsprechende Detail anzeigen möchten, ohne den Master neu zu laden.

Ein gängiges Design besteht darin, die separaten APIs für die Codierungsflexibilität und Mikroserviceangelegenheiten beizubehalten, die Datenserverseite jedoch auf der Website zu kombinieren. so dass der Kunde nur einen einzigen Anruf auf seiner eigenen Website tätigen muss. Die API-Aufrufe mit entsprechendem Caching sollten innerhalb des Rechenzentrums schnell sein.

Erwägen Sie auch, überhaupt KEINE Client-API-Aufrufe zu haben. Generieren Sie einfach die HTML-Server-Seite. Obwohl JavaScript-Frameworks für einzelne Seiten Sie auf der API-Route nach unten treiben. Dies ist normalerweise nicht der optimale Ansatz für E-Commerce-Websites mit hohem Volumen.

Bildbeschreibung hier eingeben

Ewan
quelle
Thanks, Actually Diese API wird in Android- und I-Phone-Apps verwendet. Ich möchte wissen, wann die App-Homepage geladen wird, wenn ich alle Ressourcen wie Schieberegler, Marken, Produkte in einem API-Aufruf oder einen individuellen Aufruf an die API für eine einzelne Ressource erhalte Benutzer scrollen nach unten?
Shaijut
Die gleiche Logik gilt, minimieren Sie die gleichzeitigen Anrufe, wo nicht erforderlich. Eine App bietet Ihnen jedoch mehr Flexibilität beim Herunterladen von Informationen im Hintergrund. Möglicherweise möchten Sie zu einem GetChangesSInce (Datum) -Ansatz wechseln
Ewan
Sie kommen also zu dem Schluss, dass es am besten ist, eine einzige API zu haben, die alle Ressourcen der Startseite auf einmal abruft, wenn die Startseite der App geladen wird, und unterschiedliche APIs für Schieberegler, Marken usw. separat für Mikrodienste zu haben, wenn ein Abschnitt der Seite aktualisiert werden muss ?
Shaijut
nicht, wenn Sie einen guten Grund haben, warum diese Abschnitte nicht nur mit den Seiten- / Hauptdaten geladen werden
Ewan
Ich habe letzte frage wie würden apps wie amazon, flipkart funktionieren Lädt der Benutzer nicht alle Homepage-Ressourcen auf einmal, wenn er die App öffnet? Ich möchte wissen, was diesbezüglich der beste Ansatz wäre.
Shaijut
4

TL; DR: Abgesehen von allen anderen Anwendungsaspekten ist die Ausführung eines einzelnen Anrufs schneller als die Ausführung mehrerer Anrufe. Das asynchrone Ausführen der Aufrufe kann die Gesamtzeit verkürzen, die zum Abschließen eines bestimmten Vorgangs aus Sicht Ihres Benutzers erforderlich ist (was möglicherweise alles ist, was Sie benötigen). Insgesamt würde die für mehrere Aufrufe benötigte Zeit jedoch immer noch länger sein.

In Ihrem Fall bin ich mir jedoch nicht sicher, ob das die ganze Geschichte ist.

REST-APIs sind aufgrund der verschiedenen Interpretationen des Papiers, die die Idee populär gemacht haben, ein etwas mehrdeutiger Begriff. Selbst bei der liberalsten Interpretation dessen, was eine REST-API ausmacht, passt das, was Sie haben, nicht wirklich zusammen.

Das Kernprinzip ist, dass Sie über eine Ressource verfügen, für die Sie eine Aktion ausführen möchten. Der URI identifiziert die Ressource, an der Sie interessiert sind, und Sie würden normalerweise die HTTP-Verben verwenden, um anzugeben, was Sie mit dieser Ressource tun möchten.

In Ihrem speziellen Fall haben alle Ihre Methoden das Wort 'get' im Namen. Sie sollten das in der HTTP-Anforderung verwendete Verb ändern, um anzugeben, dass Sie die an diesem Speicherort verfügbare Ressource abrufen möchten.

Ihr URI-Schema sollte die logische Hierarchie der Ressourcen darstellen, die Sie den Benutzern Ihrer API zur Verfügung stellen möchten. In Ihrem Fall würde ich also in Betracht ziehen, etwas /api/products?category=sliderszu verwenden, um Ihre Produktsammlung herauszufiltern. Dies bedeutet, dass Kunden, die alle Ihre Produkte erhalten möchten, die Abfragezeichenfolge einfach weglassen können.

Richzilla
quelle
Vielen Dank, Sie meinen also single urlfür API, aber die Anforderung an verschiedene Ressourcen sollte mithilfe von Query String erfolgen? Überprüfen Sie dies auch .
Shaijut
Ja, das asynchrone Ausführen Ihrer Anrufe würde die absolute Zeit reduzieren, die zum Abrufen der Daten benötigt wird. Insgesamt ist die benötigte Zeit jedoch immer noch größer. Weitere Anrufe müssen den Overhead einer TCP-Verbindung und einen Kommunikations-Roundtrip wiederholen. Selbst keep-alivewenn Sie Funktionen wie " Arent" verwenden, wird dies nicht vollständig beseitigt.
Richzilla
Kategorie wäre eine Eigenschaft einer einzelnen Produktressource. Logischerweise würden Sie eine Sammlung von Produkten
abrufen
Sie meinen also, wenn der Benutzer die Homepage der App öffnet, sollte ein Aufruf an die API gehen, die alle oben genannten Ressourcen zurückgibt? oder wenn er einen Bildlauf durchführt, sollten einzelne Anrufe für bestimmte Ressourcen getätigt werden, was die beste Vorgehensweise ist?
Shaijut
Dies hängt davon ab, was Ihr Benutzer an jedem Punkt Ihrer Anwendung erwartet. Nehmen Sie diese Website zum Beispiel, wenn Sie auf questionsSie die URI zu sehen ist /questions, wenn Sie auf eine Ihrer Lieblings - Tags klicken, wird der URI/questions/tagged/<tagname>
richzilla