Wie senden Sie Daten an die DELETE-Anfrage im Jersey-Client?

7

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):

%Vor%

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?

    
tonga 10.08.2014, 15:04
quelle

4 Antworten

3

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:

%Vor%     
lefloh 11.08.2014, 06:43
quelle
15

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:

%Vor%

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.

%Vor%     
CarlJi 28.06.2015 06:31
quelle
5

Nur zu beachten: Wenn Sie resteasy Implementierung von JAX RS Client API verwenden, können Sie build().invoke() :

verwenden %Vor%

Aber es funktioniert nicht mit jersey

    
Alexandr 30.03.2016 07:54
quelle
0

Sie können webTarget.request().accept(MediaType.TEXT_PLAIN).method("DELETE",yourEntity) verwenden, um DELETE mit einer Entität darin aufzurufen.

    
John Ament 10.08.2014 16:00
quelle

Tags und Links