So senden Sie schließen Daten LÖSCHEN-Anforderung in Jersey-client?
Ich habe den folgenden server-side-code im Trikot 2.x:
@Path("/store/remove/from/group")
@DELETE
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response removeStoresFromGroup(@FormParam("storeName") List<String> storeNames, @FormParam("groupName") String groupName) {
//......
}
Auf der client-Seite, die ich verwenden möchten Jersey 2.x-client zum senden einer delete-Anfrage an den oben genannten web-service. Jedoch aus der Dokumentation der Jersey-client-API, ich finde nicht, wie man schließen Sie die folgenden Daten in die Anfrage LÖSCHEN:
WebTarget webTarget = client.target("/store/remove/from/group");
MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
List<String> storeName = new ArrayList<String>();
storeName.add("Store1");
storeName.add("Store2");
storeName.add("Store3");
formData.addAll("storeName", storeName);
formData.add("groupName", "Group A");
Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).delete(); //The delete() method doesn't take any entity body in the request.
Aus der Jersey-client-API, die SyncInvoker
Klasse nicht unterstützen delete
- Methode mit entity-Körper als argument. So kann ich nur entweder POST oder PUT zum senden der Daten an den server wie in der folgenden (aber nicht LÖSCHEN):
Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).post(Entity.form(formData));
Aber ich wollen, verwenden Sie LÖSCHEN, da die Anforderung das löschen einige Ressourcen. So senden Sie eine Anfrage LÖSCHEN, die mit einigen Entität Daten über die Jersey-client?
- OT aber in der Regel brauchen Sie nicht zu senden brauchen, die eine Entität mit einer DELETE da "Die DELETE-Methode fordert, dass die origin-server löschen Sie die Ressource identifiziert durch die Request-URI". Ihre Methode Referenz klingt eher wie die Aktualisierung eines Referenz dann eine Ressource zu löschen.
- Manchmal, wenn ich möchte einige Daten löschen, die bestimmte Bedingungen erfüllt, die ich übergeben zu müssen, in der einige Parameter in der entity-body der Anfrage LÖSCHEN.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
DELETE
mit einer Person Körper ist nicht verboten aber es ist sehr ungewöhnlich, und ignoriert die von einigen frameworks/Server. Die Notwendigkeit einer Entität Körper kann darauf hindeuten, dass eineDELETE
wird nicht verwendet, wie es gedacht ist.Zum Beispiel: Wenn ein
GET /customers/4711
Retouren eines Kunden und senden Sie eineDELETE /customers/4711
den nächstenGET
auf diese Ressource zurückgeben soll ein404
. Sie gelöschte Ressource durch einen URL identifiziert wie definiert in der Spezifikation.Ihre URL
/store/remove/from/group
scheint nicht zu identifizieren eine Ressource. Mit Bezeichner wie/store/4711
oder/groups/4711
sendenDELETE
auf Sie nicht passen Ihre Bedürfnisse, weil Sie wollen, Sie zu "entfernen" eines Ladens aus einer Gruppe" nicht löschen, speichern oder eine Gruppe.Vorausgesetzt, Sie haben eine Ressource der Gruppe
und Sie wollen ein Ergebnis, wie
sind Sie nicht löschen, nichts. Sie ändern einer Ressource, so
PUT
,POST
oderPATCH
sind geeignete Methoden. JSON-Patch ist ein gutes format für die Beschreibung von solchen änderungen. Eine Anfrage würde dann so Aussehen:PATCH
- Methode wird derzeit nicht unterstützt, durch das Jersey-framework. Auch nicht-Java-web-server wie Tomcat oder Jetty-support HTTP-PATCH-Methode? Ich könnte mit PUT-Anfrage in diesem Fall, da ich das ändern der resource.PATCH
.PUT
ist eine gute Idee, aber dies hat den Nachteil, dass Sie brauchen, um zu senden Sie die gesamte modifizierte resource.PUT
für jetzt und hoffentlich httpPATCH
Methode wird offiziell in späteren Jersey release.Basiert auf dem code in Jersey 2.18 version, Die Klasse
JerseyInvocation
verwenden eine vordefinierte HashMap überprüfen HTTP-Methode und Ihrer Einheit, wie unten:Deshalb haben wir diesen Fehler "Entity null sein müssen, um die http-Methode DELETE".
Zeit, bitte beachten Sie, dass es auch eine Jersey-client-Konfiguration Eigenschaft
ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION
um zu bestimmen, ob Sie aufhören, der rest der Ausführung ist oder nicht, wir haben es hier also können diese Eigenschaft verwenden, um zu unterdrücken Validierung, um weiterhin das senden einerDELETE
Anfrage mit Entity. z.B.Nur der Hinweis: wenn Sie
resteasy
Umsetzung vonJAX RS Client API
, können Siebuild().invoke()
:Aber es funktioniert nicht mit
jersey
Können Sie
webTarget.request().accept(MediaType.TEXT_PLAIN).method("DELETE",yourEntity)
zum aufrufen einerDELETE
mit einer Person darin.DELETE
soll URI basiert. Es nicht sagen, es kann nicht mit einem Körper, wenn.. [1]: w3.org/Protocols/rfc2616/rfc2616-sec9.html