Vielleicht zu spät zum Spiel, aber ich bin auf dieses Semantikproblem gestoßen, als ich versucht habe, eine REST-API zu erstellen.
Um Wrikkens Antwort ein wenig zu erweitern, können Sie entweder 409 Conflict
oder 403 Forbidden
abhängig von der Situation verwenden. Kurz gesagt, verwenden Sie einen 403-Fehler, wenn der Benutzer absolut nichts tun kann, um den Konflikt zu lösen und die Anforderung abzuschließen (z. B. kann er keine senden DELETE
Anforderung, die Ressource explizit zu entfernen) oder verwenden Sie 409, wenn möglicherweise etwas getan werden könnte.
Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen. Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden. Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte, warum die Anforderung nicht erfüllt wurde, sollte der Grund für die Ablehnung in der Entität beschrieben werden. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Nicht gefunden) verwendet werden.
Heutzutage sagt jemand "403" und ein Berechtigungs- oder Authentifizierungsproblem kommt in den Sinn, aber die Spezifikation besagt, dass es im Grunde der Server ist, der dem Client sagt, dass er es nicht tun wird, fragen Sie es nicht noch einmal, und hier ist, warum der Client es nicht tun sollte 't.
Wie für PUT
vs. POST
... POST
sollte verwendet werden, um eine neue Instanz einer Ressource zu erstellen, wenn der Benutzer keine Möglichkeit hat oder keine Kennung für die Ressource erstellen sollte. PUT
wird verwendet, wenn die Identität der Ressource bekannt ist.
...
Der grundlegende Unterschied zwischen den POST- und PUT-Anforderungen spiegelt sich in der unterschiedlichen Bedeutung des Anforderungs-URI wider. Der URI in einer POST-Anforderung gibt die Ressource an, die die eingeschlossene Entität verarbeitet. Diese Ressource kann ein Datenakzeptanzprozess, ein Gateway zu einem anderen Protokoll oder eine separate Entität sein, die Anmerkungen akzeptiert. Im Gegensatz dazu identifiziert der URI in einer PUT-Anforderung die der Anforderung beigefügte Entität. Der Benutzeragent weiß, welcher URI beabsichtigt ist, und der Server darf NICHT versuchen, die Anforderung auf eine andere Ressource anzuwenden. Wenn der Server möchte, dass die Anforderung auf einen anderen URI angewendet wird,
es MUSS eine 301-Antwort (dauerhaft verschoben) senden; Der Benutzeragent kann dann selbst entscheiden, ob die Anforderung umgeleitet werden soll oder nicht.