Ich habe den folgenden serverseitigen Code in Jersey 2.x:
%Vor%Auf Clientseite möchte ich den Jersey 2.x-Client verwenden, um eine Löschanforderung an den obigen Webdienst zu senden. Aus der Dokumentation von Jersey client API habe ich jedoch nicht gelesen finde nicht, wie man die folgenden Daten in die DELETE-Anfrage einfügt:
%Vor% Von der Jersey-Client-API aus ist SyncInvoker
Die Klasse unterstützt keine delete
-Methode mit dem Entity-Body als Argument. So kann ich nur POST oder PUT verwenden, um die Daten wie folgt an den Server zu senden (aber nicht für DELETE):
Ich möchte jedoch die DELETE-Anfrage verwenden, da die Anfrage einige Ressourcen löscht. Wie kann ich eine DELETE-Anfrage mit einigen Entity-Daten über einen Jersey-Client senden?
A DELETE
mit einem Entity-Body ist nicht strengstens verboten , aber es ist sehr ungewöhnlich und wird von einigen Frameworks / Servern ignoriert. Die Notwendigkeit eines Entity-Body kann anzeigen, dass ein DELETE
nicht so verwendet wird, wie es beabsichtigt ist.
Zum Beispiel: Wenn ein GET /customers/4711
einen Kunden zurückgibt und Sie einen DELETE /customers/4711
senden, dann sollte der nächste GET
auf dieser Ressource einen 404
zurückgeben. Sie haben eine Ressource gelöscht, die durch eine URL wie in der Spezifikation definiert wurde .
Ihre URL /store/remove/from/group
scheint keine Ressource zu identifizieren. Die Verwendung von Bezeichnern wie /store/4711
oder /groups/4711
und das Senden von DELETE
an sie würde nicht Ihren Anforderungen entsprechen, da Sie einen Speicher aus einer Gruppe entfernen und keinen Speicher oder eine Gruppe löschen möchten.
Angenommen, Sie haben eine Gruppenressource
%Vor%und Sie möchten ein Ergebnis wie
%Vor% Sie löschen nichts. Sie ändern eine Ressource so, dass PUT
, POST
oder PATCH
geeignete Methoden sind. JSON-Patch ist ein gutes Format zum Beschreiben solcher Änderungen. Eine Anfrage würde so aussehen:
Basierend auf dem Code in der Jersey 2.18-Version verwendet die Klasse JerseyInvocation
eine vordefinierte HashMap, um die HTTP-Methode und ihre Entität wie folgt zu validieren:
Deshalb haben wir diesen Fehler erhalten "Entity muss für die HTTP-Methode DELETE null sein".
Beachten Sie bitte, dass es auch eine Jersey-Clientkonfigurationseigenschaft ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION
enthält, um zu bestimmen, ob die Ausführung des Rests gestoppt werden soll. Daher können wir diese Eigenschaft verwenden, um die Validierung zu unterdrücken, um weiterhin DELETE
zu senden. Anfrage mit Entität. z.B.
Sie können webTarget.request().accept(MediaType.TEXT_PLAIN).method("DELETE",yourEntity)
verwenden, um DELETE
mit einer Entität darin aufzurufen.