2009-02-04 8 views
11

Lasst uns sagen, dass ich eine Ressource, die zwei unterschiedliche Verhaltensweisen haben können, wenn löschenRESTful löschen Strategie

  1. Die Ressource gelöscht wird aufgerufen wird.
  2. Die Ressource wird in den Papierkorb verschoben.

Wie würde es in einer REST-konformen Weise modellieren?

Ich dachte an die folgende Lösung:

DELETE /myresource  

die Ressource in den Papierkorb bewegt (Standardverhalten)

DELETE /myresource?force-delete=true 

Kräfte auf die Ressource löschen.

Ist das REST-konform? Ich habe noch nie Abfrageparameter in der URL beim Aufruf von DELETE gesehen, ist das OK?

Antwort

4

Eine reine REST-Strategie sollte nicht wechselnde Ressourcen bevorzugen. Meiner Meinung nach ändern Sie die Ressource nicht, indem Sie einen Parameter hinzufügen, also klingt es für mich nach einer guten Strategie.

Wenn Sie so die gleiche Aktion durchzuführen waren:

DELETE /myresource.force 

, die wie eine andere Ressource handeln würde, die nicht optimal wäre.

+2

Dies bricht die "Regeln" von REST, indem Sie eine andere Ressource adressieren. Gleichzeitig bieten /myresource.json und /myresource.xml verschiedene Formate der gleichen Daten an (benutzen Sie Ihre Header akzeptieren, Leute!), Aber das wird nicht in absehbarer Zeit verschwinden. –

+0

Dies ist nicht "REST", Sie führen Aktionen auf RPC-Weise aus. – thecoshman

2

Warum nicht? Sie übergeben bereits einen Parameter, um die Ressource zu identifizieren. Senden Sie eine andere, um eine andere Vorgehensweise festzulegen. IMO, es ist perfekt RESTful.

11

Ihre Idee ist in Ordnung, aber ich denke, eine benutzerdefinierte Anfrage Header wäre ein wenig geeigneter. Abfrageparameter sind besser für Parameter geeignet.

Eine benutzerdefinierte Request-Header würde wie folgt aussehen:

DELETE /myresource 
X-Really-Delete: Yup 
2

Sie auch 2. als POST-Anforderung statt DELETE implementieren könnte.

POST /myresource 

recycle-bin=true... 

Wie in alles, was Sie tun, ist die Aktualisierung der Ressource, um anzuzeigen, dass es in der recycle-bin ist.

EDIT: geändert Methode PUT-POST gegeben einer PUT müssen einen vollständigen Ersatz (oder zusätzlich) der Ressource einzuschließen, während hier klar sind wir nur einen Teil der Ressource zu aktualisieren.

+0

Ich würde gegen Ihren Wechsel von PUT zu POST argumentieren. POST dient zum Erstellen von Inhalten, PUT ist für Änderungen; Das ganze OP macht wirklich eine Ressource mit einem bestimmten Wert, dh sie zu aktualisieren. – thecoshman

+0

@thecoshman PUT ist create or replace, bei dem die gesamte Entität in der Anforderung eingeschlossen sein muss. Änderungen können über die PATCH-Methode vorgenommen werden, haben jedoch nur eingeschränkte Unterstützung. – rojoca

+0

erh ... etwas. PUT kann verwendet werden, um Inhalte zu erstellen, wie auch POST. Der Unterschied besteht darin, dass Sie PUT bei einem bestimmten URI erstellen, während Sie beim POST den Server auffordern, herauszufinden, unter welchem ​​URI er gespeichert werden soll. PUT kann auch verwendet werden, um eine Ressource zu ersetzen. Sie haben recht, wenn Sie sagen, dass PATCH die richtige Methode ist, um ein kleines Update wie dieses zu machen. In Ermangelung einer geeigneten Unterstützung wäre es die "richtige" Lösung, die vollständige Ressource abzurufen, sie zu aktualisieren und die vollständige Aktualisierungsressource auf dem Server auf denselben URI zu setzen. – thecoshman

2

DELETE sollte das Element löschen, keine Fragen gestellt.

Leider gibt es keine "MOVE" Anfrage in HTTP. POST ist normalerweise zum Erstellen von Inhalten gedacht, PUT ist mehr Modifikationen.

Also würde ich vorschlagen, dass Sie etwas wie PUT /myresource mit irgendeiner Form von Metadaten oder einer JSON-Zeichenkette entlang der Linien von { "recycle":"true" } tun, um anzuzeigen, dass Sie es "recyceln" wollen.