2010-12-23 19 views
11

Nehmen wir an, wir haben eine Entität, die eine Liste von Benutzern auf dem Server enthält, und wir möchten diese als Rest verfügbar machen. Was ist der richtige Weg?Was ist der richtige Weg zum Hinzufügen/Löschen von Viele-zu-Viele-Beziehungen in REST?

Meine erste Vermutung ist so etwas wie dieses:

/entity/1/user/5 

Wir können für Updates genutzt und für Löschungen DELETE?

Ist das richtig? Ich ging in Wikipedia, wo es um Ruhe geht, und ihre Ansicht davon ist, dass alles nur 1 Level tief ist. Vielleicht möchten sie, dass Sie PUT/POST verwenden und den gesamten JSON-Graphen übergeben und das ganze Ding auf einmal aktualisieren?

+0

was meinst du damit, ist dies der Rest api >> https://graph.facebook.com/19292868552 – XMen

+0

@Rahul Mehta: Einheit wie in einem Geschäftsobjekt, wie "Hotel", "Club", "Frage", etc. – egervari

+0

könnten Sie etwas wie OData versuchen http://www.odata.org/developers/protocols/json-format#RepresenttingCollectionsOfEntries – jfs

Antwort

10

Ihr Beispiel ist ein vollkommen gültiger Ansatz. In vielen Fällen kann jedoch eine User außerhalb des Kontexts von nur entity existieren. Ich neige dazu, Ressourcen in Isolation zu identifizieren, zB:

/entity/1 
/user/5 

Benutzer zu einer Einheit verbunden ist, zu sehen, ich würde:

/entity/1/users 

einen Benutzer hinzufügen könnte, indem Sie einen Benutzer erfolgen,

POST /entity/1/users 
<User> 
... 
</User> 

Wenn ein Benutzer gelöscht wäre

DELETE /User/5 

Aktualisieren oder Erstellen eines Benutzers könnte mit PUT

Entfernen der Assoziation zwischen einem Benutzer und ein Unternehmen erfordert ein wenig Kreativität erfolgen. Sie könnten

DELETE /Entity/1/User/5 

tun, wie Sie vorgeschlagen, oder so ähnlich

DELETE /Entity/1/UserLink?UserId=5 

oder nur

DELETE /Entity/1/Users?UserId=5 

Es Realität ist nicht sehr wichtig für den Benutzer Ihrer API, was Ihre URI aussieht .Es ist gut, für Ihre eigene Gesundheit konsistent zu sein, es ist gut, Schemata zu wählen, die mit Ihrem Server-Framework leicht zu versenden sind, aber es ist nicht das, wie Ihre URIs aussehen, sondern was Sie damit tun.

+0

Danke für alle Ansätze. Ich denke, dein Beitrag ist sehr hilfreich, weil er bestätigt, dass das, was ich tue, korrekt ist. Zum Beispiel habe ich/entity/1 und/user/5, wenn ich sie einzeln benutze ... Ich hatte nur Probleme mit dem Viele-zu-Viele-Fall. Wie du schon sagtest, für Löschungen musst du so etwas wie/entity/1/user/5 machen. Da ich weiß, was die ID ist im Voraus ... es ist nicht viel einfacher, einen Beitrag tatsächlich zu tun, und ich kann meine hinzufügen/entfernen URLs die gleiche, die ich denke, erhöht die Vernunft;) Danke für die Antwort. – egervari

1

Ich verwende Ihre Methode für übergeordnete/untergeordnete Entitäten, aber für viele-zu-viele verwende ich ein Array in meinem JSON-Objekt, das diese Entität darstellt.

Ihr Beispiel So verwenden:

GET /entity/1 

ein Entitätsobjekt so etwas wie dies zurückkehren würde:

{"entityID":1,"name":"whatever","users":[1,2,3,4,5]} 

PUT in diesem gleichen Objekt übergeben würde, und aktualisiert das Unternehmen und die Benutzer. Dann, um die spezifischen Benutzerinformationen zu erhalten:

Mit PUT auf Benutzer/3 würde den Benutzer aktualisieren. PUT on/entity/1 würde Benutzer mit Entitäten verbinden. Leider gibt es nicht viele gute Informationen darüber, wie man so etwas modellieren kann.

+0

Hrm ... nun, ich habe bereits/entity/x und/user/x für die einzelnen Entitäten. Wäre Ihre Methode nicht ein bisschen ineffizient? Wenn ich einer Entität einen neuen Benutzer hinzufügen möchte, müsste ich die aktuelle Liste der Benutzer abrufen, eine anhängen und dann die gesamte Liste zurücksenden. Das ist wirklich der Standard Weg, es zu tun? Das klingt bizarr ... aber ich denke, ich würde es nicht an den Leuten vorbeibringen, die diese Standards schreiben;) – egervari

+0

Nein, es ist kein Standard, nur etwas, was mir einfällt. Auflösungstabellen sind so einfach und eng, dass ich die Datensätze immer gelöscht und neu erstellt habe, wenn die übergeordnete Entität geändert wurde. Die Einfachheit übertrumpft meiner Meinung nach die Ineffizienz. Der einzige Fall, in dem ich dies nicht tun würde, wäre, wenn die gleiche Entität oft genug bearbeitet würde, um relevant zu sein. –

Verwandte Themen