Sollte ich die Benutzer-ID in der REST-URL-Struktur angeben?

9

Grundsätzlich besteht eine Funktion meiner App darin, die Freunde des angemeldeten Benutzers abzurufen.

Eigentlich zögere ich zwischen beiden Endpunkten:

  1. GET / api / users / friends
  2. GET / api / users /: userId / friends

Die Verwendung von 1 userIdwäre über das Authentifizierungstoken erreichbar.
Bei Verwendung von 2 müsste der Server zusätzlich die Übereinstimmung zwischen der übergebenen userIdund der protokollierten Benutzer-ID überprüfen , die im Authentifizierungstoken angegeben ist, um böswilligen Zugriff auf andere Benutzerdaten wie Freunde zu vermeiden.

1 sollte also genug sein, aber es klingt nicht nach einer Standard-Ruhe-URL.

Was ist eine gute Praxis?

Mik378
quelle

Antworten:

7

Die erste Lösung hat den Vorteil, dass keine Daten dupliziert werden. Die Anfrage bedeutet eindeutig:

Hallo, ich bin John. Gib mir die Liste meiner Freunde.

Wenn möglich, würde ich es sogar verkürzen GET /api/friends.

Wenn Sie jedoch erwarten, auf Freunde anderer Benutzer zugreifen zu können, erscheint die zweite Lösung als die gute. Die Anfrage bedeutet:

Hallo, ich bin John. Gib mir die Liste der Freunde von John.

kann aber auch sein:

Hallo, ich bin John. Gib mir die Liste der Freunde Mariens.

Eine Situation, in der eine solche Änderung möglich sein kann, ist beispielsweise, dass eine Person ihre eigenen Freunde, aber auch Freunde ihrer Freunde finden kann.

Arseni Mourzenko
quelle
Gute Antwort, danke. Sie haben gerade bestätigt, was ich dachte;)
Mik378
Ich würde noch einen Schritt weiter gehen. Mit GET /api/friendswürde ich es umbenennen GET /api/myFriends. Unter dem Gesichtspunkt der Auffindbarkeit ist es selbstdokumentierender. Bei REST ist es außerdem nützlich, darüber nachzudenken, wie ein Browser / Proxy-Cache damit umgehen würde. Mit ist GET /api/myFriendses durchaus möglich, einen Fehler zu haben, bei dem Sie aufgrund von Caching die falschen Freunde anzeigen.
ArTs
Wenn Sie relative URIs verwenden (relativ zum angemeldeten Benutzer), gibt es einen Haken: Die Implementierung bestimmter Szenarien ist umständlich. Insbesondere, wenn Sie möchten, dass sich ein Benutzer als ein anderer ausgibt, z. B. ein Support-Benutzer, der sich anmelden und alles als ein anderer Benutzer anzeigen muss. Wenn er als Support-Benutzer angemeldet ist, aber versucht, sich als Benutzer auszugeben, dem er helfen möchte, wird er sich am Ende seine eigenen Freunde ansehen, nicht die des Benutzers, dem er helfen möchte.
Jbm
3

Rest APIs müssen hypertextgesteuert sein! Wie Sie auf einer Standard-HTML-Seite von einem Link zum anderen klicken würden.

Eine URL ist eine eindeutige Kennung für eine Ressource. Eine URL, die mehr als eine Ressource darstellt, stimmt nicht mit ReST überein.

Mit Ihrem Beispiel die folgende URL:

/api/users/:userId

sollte einen Link in seiner Antwort auf die URL: userId friends haben

Die Dissertation von Roy Fielding enthält eine Reihe von Einschränkungen, die zur Einhaltung von ReST erforderlich sind.

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven http://fr.slideshare.net/rnewton/2013-06q-connycrestfulwebapis http: //www.ics. uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Christophe Willemsen
quelle