Entwerfe ich diese WCF RESTful-Schnittstelle richtig?

9

Ich erstelle einen WCF-Webservice mit WcF-Authentifizierungsdienst und die erste Reihe von Funktionen, die ich brauche, ist die Verwaltung eines Posteingangs für einen Client. Der Client wird durch die Authentifizierung bestimmt.

Dies ist mein Versuch eines RESTful-Designs der API:

https://api.mydomain.com/v1/inbox/messages (GET)

Gibt eine Seite mit Ergebnissen im Posteingang zurück, auf die ein optionaler Suchfilter angewendet wurde

  • Anzahl - Anzahl der Datensätze pro Seite
  • Seite - Seite zum Starten auf
  • Sortieren - (optional) Feld zum Sortieren nach
  • Suche - (optional) Text nach
  • suchen

https://api.mydomain.com/v1/inbox/mark (POST)

Markiert eine oder mehrere gelesene oder ungelesene Nachrichten

  • Aktion - MarkRead oder MarkUnread
  • MessageIDs - Liste der zu markierenden Nachrichten-IDs

https://api.mydomain.com/v1/inbox/archive (POST)

Archiviert eine oder mehrere Nachrichten

  • MessageIDs - Liste der zu archivierenden Nachrichten-IDs

Mache ich das richtig? Wenn nicht, was wäre eine bessere Möglichkeit, diese Schnittstelle zu entwerfen?

    
Jason 13.09.2011, 22:08
quelle

3 Antworten

1

Martin Fowler hat eine gute Zusammenfassung des Richardson Maturity Models und was es braucht, um einen RESTful Service zu machen. Jan verwies auf einen Beitrag von Roy Fielding, aber neben Hypermedia (und HATEOAS ) gibt es auch einige Schritte.

In Bezug auf das Richardson-Modell würde ich denken, dass Ihre API einige Änderungen benötigen würde, um zu "Level 3" ( Duh Duh Duhhhh). Die /v1/inbox/messages -Auflistung sieht gut aus, und nur die Unterstützung von GET zeigt an, dass es sich um eine schreibgeschützte Ressource für den Benutzer handelt. % Co_de% ing Aktionen und IDs für POST und /v1/inbox/mark ist jedoch nur das Tunneln von RPC-ähnlichen Diensten über HTTP - "Level 0" im Artikel .

Ich würde etwas wie das Folgende als eine naive, nicht hypermediale (d. h. "Stufe 2") API vorschlagen:

  • Um eine Liste von Zusammenfassungsinformationen aller Nachrichten (in allen Ordnern) abzurufen:

    %Vor%

    Antwort:

    %Vor%
  • Um eine vollständige Nachricht abzurufen:

    %Vor%

    Antwort:

    %Vor%
  • Um eine Nachricht zu bearbeiten (z. B. um sie als gelesen zu markieren und in den Archivordner zu verschieben):

    %Vor%

    Hinweis: Hier verwende ich absichtlich /v1/inbox/archive anstelle von POST , um eine teilweise Aktualisierung anzuzeigen.

Andere Dinge, die Aufmerksamkeit erfordern, sind:

  • Hypermedia-Antworten und Medientypen Ehrlich gesagt, wird dies besser von anderen erklärt (zB das REST In Practice Buch oder das InfoQ Coffee Cup-Beispiel von den gleichen Autoren), aber kurz gesagt sollten Ihre Antworten dem Kunden anzeigen, welche anderen Aktionen aus der Antwort möglich sein könnten zu ihrer letzten Anfrage und erlauben ihnen, die gesamte API von nur einer einzigen URI zu entdecken. Als ein Beispiel gibt es eine Implikation von Ordnersammlungen oben. Wenn PUT zurückgegeben wird:

    %Vor%

    Dann würde der Client ein konkretes Beispiel für einen URI haben, um GET /v1/messages/1234 zu testen, und eine gute Idee von dem, was da sein könnte.

  • Antwortcodes und Inhalt: OPTIONS ist offensichtlich. Reagieren Sie mit 200 OK , wenn der Benutzer nicht berechtigt ist, eine bestimmte Nachricht anzuzeigen, 403 Forbidden , wenn die Nachrichten-ID nicht vorhanden ist. Jedes Mal, wenn Sie einen Fehler zurückgeben, geben Sie dem Kunden einige Hinweise, wie er seine Anfrage korrigieren kann (wenn überhaupt möglich).

Ian 30.09.2011 02:06
quelle
0

Betreffend gelesen / ungelesenen Teil Ich glaube nicht, dass du einen Posten brauchst. Ich denke du brauchst Put-Methode Ссылка https://api.mydomain.com/v1/inbox/messageId/Unread

Beitrag beim Erstellen eines neuen Datensatzes benötigt und Sie möchten

aktualisieren

Für den Archivteil stimme ich zu. Denken Sie daran, das Ergebnis für den Archivierungsprozess zurückzugeben.

    
Gregory Nozik 14.09.2011 12:02
quelle
0

Roys POST ist hilfreich, wenn man sich solchen Fragen stellt: Ссылка

Daher: Konzentrieren Sie sich darauf, Medientypen zu definieren, anstatt Ihre Clients mit vordefinierten URIs zu koppeln. Sie müssen nicht registriert werden, um nützlich zu sein, BTW.

Vielleicht auch Ссылка

    
Jan Algermissen 27.09.2011 20:50
quelle