RESTful API benötigte Parameter in Abfragezeichenfolge?

8

Was ist zu tun, wenn eine GET-Anfrage nur dann sinnvoll ist, wenn der Anfrage spezifische Parameter zugeordnet sind? Sollten die Parameter als Abfragezeichenfolge übergeben werden, und wenn ja, was tun, wenn alle Parameter nicht angegeben oder falsch formatiert sind?

Nehmen wir beispielsweise an, ich habe eine Post-Ressource, auf die der Endpunkt "api / posts" zugreifen kann. Jeder Beitrag hat einen geografischen Standort und Beiträge können NUR abgerufen werden, wenn ein Bereich angegeben wird, in dem sich die Beiträge befinden können. Daher sind 3 Parameter erforderlich: Breite, Länge und Radius.

Ich kann mir in diesem Fall 2 Möglichkeiten vorstellen:
1. Setzen der Parameter in die Abfragezeichenfolge: api/posts/?lat=5.54158&lng=71.5486&radius=10
2. Setzen Sie die Parameter in die URL: api/posts/lat/5.54158/lng/71.5486/radius/10

Welche davon wäre der richtige Ansatz? Es scheint falsch zu sein, die erforderlichen Parameter in den Query-String zu schreiben, aber der letztere Ansatz fühlt sich etwas "hässlicher" an.

PS. Mir ist bewusst, dass es bereits viele Diskussionen zu diesem Thema gibt (zum Beispiel: REST API Best Practices: Wo sind Parameter zu platzieren? ), aber meine Frage ist speziell auf den Fall gerichtet, wenn Parameter benötigt werden, nicht optional.

    
abc 18.02.2015, 18:07
quelle

3 Antworten

2
  

Wenn Sie eine RESTful-API entwerfen, was tun, wenn eine GET-Anfrage nur ausgeführt wird   Sinn, wenn der Anfrage spezifische Parameter zugeordnet sind?   Sollten die Parameter als Abfragezeichenfolge übergeben werden, und wenn ja, was?   wenn alle Parameter nicht angegeben oder formatiert sind   falsch?

Bei REST muss Ihre API die REST-Einschränkungen erfüllen, die in der Fielding Dissertation . Eine dieser Einschränkungen ist die einheitliche Schnittstellenbeschränkung, die die HATEOAS-Einschränkung enthält. Gemäß der HATEOAS-Einschränkung muss Ihre API ein Standard-Hypermedia-Format als Antwort bereitstellen. Dieses Hypermedium enthält Hyperlinks (z. B. HTML-Links, Formulare), die mit Metadaten versehen sind (z. B. Link-Beziehung oder RDF-Annotation). Die Clients prüfen die Metadaten, was ihnen erklärt, was der Hyperlink tut. Danach können sie entscheiden, ob sie dem Link folgen wollen oder nicht. Wenn sie dem Link folgen, können sie die HTTP-Anfrage basierend auf der URI-Vorlage, den Parametern usw. erstellen und sie an den REST-Service senden.

In Ihrem Fall spielt es keine Rolle, welche URI-Struktur Sie verwenden, es ist nur für die Service-Verwendung, da der Client immer die angegebene URI-Vorlage verwendet und es dem Client egal ist, was in dieser Vorlage ist, bis es eine gültige URI-Vorlage ist was es mit Parametern füllen kann.

In den meisten Fällen verfügt Ihr Client über ausreichende Validierungsinformationen, um zu testen, ob die Parameter falsch sind oder fehlen. In diesem Fall sendet es keine HTTP-Anfrage, Sie haben also nichts im Service zu tun. Wenn ein ungültiger Parameter durchkommt, sendet Ihr Dienst in Ihrem Fall eine 404 zurück - nicht gefunden, da der URI der Ressourcenbezeichner ist und keine Ressource zu einem ungültigen URI gehört (generiert aus der angegebenen URI-Vorlage und ungültigen Parametern) / p>     

inf3rno 18.02.2015, 19:05
quelle
7

Der erste Ansatz ist besser.

%Vor%



Der zweite Ansatz ist ein wenig irreführend.

%Vor%

Sie sollten sich jedes Ihrer Verzeichnisse als Ressourcen vorstellen. In diesem Fall sind Unterressourcen (zum Beispiel: "api / posts / lat / 5.54158") nicht wirklich Ressourcen und somit irreführend. Es gibt Fälle, in denen dieses Muster eine bessere Lösung ist, aber wenn ich mir die gegebenen Informationen ansehe, würde ich die Abfragezeichenfolge verwenden. Es sei denn, du hast eine Entität, die dich verlinkt, um dich direkt mit dieser URL zu verlinken, mag ich nicht wirklich.

    
Isaiah van der Elst 18.02.2015 18:35
quelle
4

Sie sollten alles in die Abfragezeichenfolge eingeben und den Server so einstellen, dass er einen Fehlercode zurückgibt, wenn er die 3 erforderlichen Parameter nicht empfängt.

Weil es eine Gruppe von Parametern ist, die ein Objekt identifizieren.

Nehmen wir das Beispiel: lat = 5,54158; lng = 71.5486 radius = 10

Es wäre sehr unwahrscheinlich, dass diese URL einen Sinn ergibt:

api/posts/lat/5.54158/lng/yyyy/radius/zz

Es ist anders als:

api/memb/35/..

weil das Mitglied mit der ID 35 viele Funktionen (also gültige URLs) wie folgt haben kann:

api/memb/35/status oder api/memb/35/lastlogin

    
user3413154 18.02.2015 18:33
quelle

Tags und Links