Wir starten eine neue REST-API und ich wollte einige Community-Beiträge zu Best Practices für die Formatierung von Eingabeparametern:
Derzeit ist unsere API sehr JSON-zentriert (gibt nur JSON zurück). Die Debatte darüber, ob wir XML zurückgeben wollen / müssen, ist ein separates Thema.
Da unsere API-Ausgabe JSON-zentriert ist, haben wir einen Weg eingeschlagen, in dem unsere Eingaben etwas JSON-zentriert sind, und ich habe gedacht, dass dies für einige praktisch, aber im Allgemeinen seltsam sein könnte.
Um beispielsweise einige Produktdetails zu erhalten, bei denen mehrere Produkte gleichzeitig abgerufen werden können, haben wir derzeit:
http://our.api.com/Product?id=["101404","7267261"]
Sollten wir dies vereinfachen als:
http://our.api.com/Product?id=101404,7267261
Oder ist eine JSON-Eingabe praktisch? Eher ein Schmerz?
Wir möchten vielleicht beide Stile akzeptieren, aber verursacht diese Flexibilität tatsächlich mehr Verwirrung und Kopfschmerzen (Wartbarkeit, Dokumentation usw.)?
Ein komplexerer Fall ist, wenn wir komplexere Eingaben anbieten möchten. Wenn wir beispielsweise mehrere Filter für die Suche zulassen möchten:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Wir möchten die Filtertypen (z. B. Produkttyp und Farbe) nicht unbedingt als Anforderungsnamen wie folgt einfügen:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Weil wir alle Filtereingaben zusammenfassen wollten.
Ist das am Ende wirklich wichtig? Es ist wahrscheinlich, dass es so viele JSON-Utils gibt, dass der Eingabetyp einfach nicht so wichtig ist.
Ich weiß, dass unsere JavaScript-Clients, die AJAX-Aufrufe an die API ausführen, die JSON-Eingaben möglicherweise schätzen, um ihnen das Leben zu erleichtern.
[]
Syntax nicht immer unterstützt wird (und obwohl sie häufig vorkommt, sogar gegen die URI-Spezifikation verstoßen kann). Einige HTTP-Server und Programmiersprachen bevorzugen es, nur den Namen zu wiederholen (zproductType=value1&productType=value2
. B. )./user/
und im Body ändern möchte, sende ich{ q:{}, d: {} }
mitq
als Abfrage von mit dem Benutzer wird in der DB abgefragt undd
als geänderte Daten.Die Standardmethode zum Übergeben einer Liste von Werten als URL-Parameter besteht darin, sie zu wiederholen:
http://our.api.com/Product?id=101404&id=7267261
Der meiste Servercode interpretiert dies als eine Liste von Werten, obwohl viele Einzelwertvereinfachungen aufweisen, sodass Sie möglicherweise nachsehen müssen.
Begrenzte Werte sind ebenfalls in Ordnung.
Wenn Sie JSON an den Server senden müssen, wird es mir nicht gerne in der URL angezeigt (die ein anderes Format hat). Insbesondere haben URLs eine Größenbeschränkung (in der Praxis, wenn nicht theoretisch).
Ich habe gesehen, wie einige eine komplizierte Abfrage RESTfully ausführen, und zwar in zwei Schritten:
POST
Ihre Abfrageanforderungen, Erhalt einer ID (im Wesentlichen Erstellen einer Suchkriterienressource)GET
die Suche unter Bezugnahme auf die obige IDquelle
Zuerst:
Ich denke, Sie können es auf zwei Arten tun
http://our.api.com/Product/<id>
: wenn Sie nur einen Datensatz möchtenhttp://our.api.com/Product
: wenn Sie alle Datensätze wollenhttp://our.api.com/Product/<id1>,<id2>
: wie von James vorgeschlagen, kann eine Option sein, da das, was nach dem Product-Tag kommt, ein Parameter istOder die, die mir am besten gefällt, ist:
Sie können die Eigenschaft Hypermedia als Engine of Application State (HATEOAS) eines RestFul WS verwenden und einen Aufruf
http://our.api.com/Product
ausführen, der die entsprechenden URLs von zurückgeben sollhttp://our.api.com/Product/<id>
und diese anschließend aufrufen soll.Zweite
Wenn Sie Abfragen zu den URL-Aufrufen durchführen müssen. Ich würde vorschlagen, HATEOAS wieder zu verwenden.
1) Rufen Sie an
http://our.api.com/term/pumas/productType/clothing/color/black
2) Rufen Sie an
http://our.api.com/term/pumas/productType/clothing,bags/color/black,red
3) (Verwenden von HATEOAS) Rufen Sie ` http://our.api.com/term/pumas/productType/ an -> erhalten Sie die URLs aller möglichen Kleidungsstücke -> rufen Sie die gewünschten an (Kleidung und Taschen) - > Erhalte die möglichen Farb-URLs -> rufe die gewünschten an
quelle
Vielleicht möchten Sie RFC 6570 auschecken . Diese URI-Vorlagenspezifikation zeigt viele Beispiele dafür, wie URLs Parameter enthalten können.
quelle
Erster Fall:
Eine normale Produktsuche würde so aussehen
http://our.api.com/product/1
Ich denke also, dass die beste Vorgehensweise für Sie wäre, dies zu tun
http://our.api.com/Product/101404,7267261
Zweiter Fall
Suche mit Querystring-Parametern - gut so. Ich wäre versucht, Begriffe mit UND und ODER zu kombinieren, anstatt sie zu verwenden
[]
.PS Dies kann subjektiv sein, also tun Sie, womit Sie sich wohl fühlen.
Der Grund für das Einfügen der Daten in die URL besteht darin, dass der Link auf einer Website eingefügt / zwischen Benutzern geteilt werden kann. Wenn dies kein Problem ist, verwenden Sie stattdessen auf jeden Fall einen JSON / POST.
BEARBEITEN: Ich denke, dieser Ansatz passt zu einer Entität mit einem zusammengesetzten Schlüssel, aber nicht zu einer Abfrage für mehrere Entitäten.
quelle
/
nicht vorhanden sein, da der URI eine Ressource und keine Sammlung adressiert.Ich werde mich der Antwort von nategood anschließen, da sie vollständig ist und Ihren Bedürfnissen zu entsprechen schien. Ich möchte jedoch einen Kommentar zur Identifizierung mehrerer (1 oder mehr) Ressourcen auf diese Weise hinzufügen:
http://our.api.com/Product/101404,7267261
Dabei haben Sie:
Komplexisieren Sie die Clients, indem Sie sie dazu zwingen, Ihre Antwort als Array zu interpretieren. Dies ist für mich nicht intuitiv, wenn ich die folgende Anfrage stelle:
http://our.api.com/Product/101404
Erstellen Sie redundante APIs mit einer API zum Abrufen aller Produkte und der obigen zum Abrufen von 1 oder mehreren. Da Sie einem Benutzer aus Gründen von UX nicht mehr als eine Seite mit Details anzeigen sollten, wäre es meines Erachtens nutzlos und würde nur zum Filtern der Produkte verwendet, mehr als eine ID zu haben.
Es ist vielleicht nicht so problematisch, aber Sie müssen dies entweder selbst serverseitig behandeln, indem Sie eine einzelne Entität zurückgeben (indem Sie überprüfen, ob Ihre Antwort eine oder mehrere enthält) oder Clients sie verwalten lassen.
Beispiel
Ich möchte ein Buch bei Amazing bestellen . Ich weiß genau, um welches Buch es sich handelt, und ich sehe es in der Liste, wenn ich nach Horrorbüchern navigiere:
Nachdem ich das zweite Buch ausgewählt habe, werde ich zu einer Seite weitergeleitet, auf der der Buchteil einer Liste aufgeführt ist:
Oder auf einer Seite, die mir nur die vollständigen Details dieses Buches gibt?
Meine Meinung
Ich würde vorschlagen, die ID in der Pfadvariablen zu verwenden, wenn die Einheitlichkeit beim Abrufen der Details dieser Ressource garantiert ist. In den folgenden APIs werden beispielsweise mehrere Möglichkeiten vorgeschlagen, um die Details für eine bestimmte Ressource abzurufen (vorausgesetzt, ein Produkt hat eine eindeutige ID und eine Spezifikation für dieses Produkt hat einen eindeutigen Namen und Sie können von oben nach unten navigieren):
In dem Moment, in dem Sie mehr als eine Ressource benötigen, würde ich vorschlagen, aus einer größeren Sammlung zu filtern. Für das gleiche Beispiel:
Dies ist natürlich meine Meinung, da es nicht auferlegt wird.
quelle