2016-05-03 13 views
1

Meine Anwendung akzeptiert http DELETE-Anfragen, die Einträge aus einer Datenbank durch Hibernate entfernt entfernen.Was ist der korrekte HTTP-Statuscode, der zurückgegeben werden soll, wenn DELETE nicht ausgeführt werden kann?

Das Entfernen bestimmter Einträge würde eine hibernate.ConstraintViolationException verursachen, da sie in einer anderen Tabelle Schlüssel sind, daher werden sie nicht akzeptiert. Dieser Fehler kann sich jedoch je nach Zustand des DBs zeitlich ändern.

Wie lautet die HTTP-Antwort für ein solches Szenario?

Ich dachte an 412 (Vorbedingung fehlgeschlagen), weil die Vorbedingung des Eintrags, der nicht vom System verwendet wird, nicht erfüllt ist.

+1

Vielleicht möchten Sie [die Definition des 412-Codes] erneut lesen (https://tools.ietf.org/html/rfc7232#section-4.2). Dieser Statuscode ist für Ihr Problem nicht geeignet. – DaSourcerer

+0

@DaSourcerer, habe ich es als PRECONDITION interpretiert: = "der Eintrag wird nicht in anderen Tabellen verwendet". Ich schätze, es gibt einen geeigneteren Status für die Rückkehr und deshalb habe ich die Frage gestellt. Was wäre ein angemessener Status in einem solchen Szenario? –

+0

Nein, die Vorbedingung ist eine Referenz auf den Header 'If- * '. Um genau zu sein: Es ist die Voraussetzung für eine bedingte Anfrage des Kunden, die fehlgeschlagen ist. – DaSourcerer

Antwort

1

Haben Sie über 409 nachgedacht? - "Der Statuscode 409 (Konflikt) zeigt an, dass die Anforderung aufgrund eines Konflikts mit dem aktuellen Status der Zielressource nicht abgeschlossen werden konnte. Dieser Code wird in Situationen verwendet, in denen der Benutzer den Konflikt möglicherweise lösen und den Konflikt erneut übermitteln kann Der Server SOLLTE eine Nutzlast generieren, die genügend Informationen enthält, damit ein Benutzer die Quelle des Konflikts erkennen kann. " - https://greenbytes.de/tech/webdav/rfc7231.html#status.409

+0

Das ist überzeugend: Ich war bereit, die 424 zu akzeptieren, aber jetzt klingt 409 auch völlig in Ordnung. Der Client muss den Konflikt lösen, dh einen zweiten Eintrag löschen, der auf den ursprünglichen verweist, um das erste DELETE anzufordern. Ich fand das alles ziemlich verwirrend: Was ist der Unterschied zwischen einer (gescheiterten) Abhängigkeit und einem "Konflikt"? –

+0

Haben Sie versucht, die Spezifikation zu lesen? Noch unklar? –

+0

Ja und ich glaube, dass 409 und 429 für das in meiner ursprünglichen Frage beschriebene Szenario geeignet sein könnten. In meinem tatsächlichen Fall denke ich, dass 409 der richtige ist und dass der Server den Client informieren sollte, welche anderen Schritte (z. B. DELETEs) erforderlich sind, um das ursprüngliche LÖSCHEN sicher auszuführen. Nehmen wir an, der Server unterstützt ein rekursives Löschen für jedes verweisende Element, aber es ist ein Fehler aufgetreten (z. B. ein geschütztes Element), 429 wäre der richtige, ich denke, wenn nicht ein 5xx. –

1

Das klingt viel wie der Client hätte nicht die Befugnisse, um diesen Fehler zu korrigieren, wenn es auftritt. Das allein ist etwas, das für die 5xx-range der Statuscodes qualifizieren würde:

Die 5xx (Server Error) Klasse von Statuscode gibt an, dass der Server bekannt ist, dass sie Fehler begangen hat oder nicht in der Lage die Durchführung der angeforderten Methode. [...] Diese Antwortcodes gelten für jede Anfrage-Methode.

Um genau zu sein, denke ich 503 (Service Unavailable) ist hier in Ordnung. Dieser Code ist hauptsächlich dafür bekannt, die Wartung anzuzeigen, aber er weist tatsächlich auf einen temporären Zustand auf der Serverseite hin, der verhindert, dass die Anforderung erfüllt wird. Dies würde auch im Einklang mit this answer sein.

Wenn Sie mit dieser unbequem sind, sind hier einige Alternativen, um der Empfehlung:

jedoch wenn der Auftraggeber hat Möglichkeit, diesen Fehler zu korrigieren (z. B. durch eine andere Anfrage), die 5xx-Klasse ist ou t Frage und Sie sollten mit Code 424 beginnen. Wenn Sie Bedenken haben, dass dieser Code von WebDAV eingeführt wird, keine Sorge: Er ist in der IANA HTTP Status Code Registry aufgeführt und daher in HTTP gültig.

+0

424. Ich habe das vorher nicht bemerkt. Es ist in der Tat so: andere Aktionen wie ein Löschen anderer Entitäten werden zuerst angefordert. Es ist nicht wirklich ein Server-Side-Fehler. Vielen Dank. –

+0

424 passt nicht: "Der Statuscode 424 (Failed Dependency) bedeutet, dass die Methode für die Ressource nicht ausgeführt werden konnte, weil die angeforderte Aktion von einer anderen Aktion abhängig war und diese Aktion fehlschlug. Zum Beispiel, wenn ein Befehl in einer PROPPATCH-Methode fehlschlägt Dann werden mindestens die restlichen Befehle auch mit 424 (Fehlgeschlagene Abhängigkeit) fehlschlagen. " –

Verwandte Themen