Comment envoyer joindre les données à SUPPRIMER la demande en Jersey client?
J'ai le texte suivant du code côté serveur en Jersey 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) {
//......
}
Sur le côté client, je veux utiliser Jersey 2.x client pour envoyer une demande de suppression ci-dessus pour le service web. Cependant, à partir de la documentation de Maillot client API, je n'ai pas trouvé comment joindre les données suivantes dans la demande de SUPPRESSION:
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.
De le Maillot de l'API client, le SyncInvoker
classe ne prend pas en charge un delete
méthode avec les corps d'entité comme argument. Donc je ne peux utiliser soit POST ou PUT pour envoyer les données au serveur comme suit (mais pas SUPPRIMER):
Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).post(Entity.form(formData));
Mais je veux utiliser pour SUPPRIMER la demande la demande la suppression de certaines ressources. Comment envoyer une demande de SUPPRESSION avec certaines données de l'entité via Jersey client?
Parfois, si je veux supprimer certaines des données qui satisfait à certaines conditions, j'ai besoin de passer des paramètres dans le corps de l'entité de demande de SUPPRESSION.
OriginalL'auteur tonga | 2014-08-10
Vous devez vous connecter pour publier un commentaire.
Un
DELETE
avec un corps d'entité n'est pas strictement interdit mais c'est très rare et ignorées par certains cadres de travail et des serveurs. La nécessité d'un corps d'entité peut indiquer qu'unDELETE
n'est pas utilisé comme il est prévu.Par exemple: Si un
GET /customers/4711
retourne un client et que vous envoyez unDELETE /customers/4711
la prochaineGET
sur cette ressource doit retourner un404
. Vous avez supprimé une ressource identifié par une URL comme défini dans la spécification.Votre URL
/store/remove/from/group
ne semble pas à identifier une ressource. Grâce à des identifiants comme/store/4711
ou/groups/4711
et l'envoi d'unDELETE
pourrait pas s'adapter à vos besoins parce que vous voulez "supprimer un magasin, à partir d'un groupe de" ne pas supprimer un magasin ou d'un groupe.En supposant que vous avez un groupe de ressources
et que vous voulez un résultat comme
vous n'êtes pas supprimer quoi que ce soit. Vous êtes à la modification d'une ressource afin
PUT
,POST
ouPATCH
sont approprié des méthodes. JSON-Patch est un bon format pour décrire de tels changements. Une requête devrait ressembler à ceci:PATCH
méthode n'est pas actuellement pris en charge par Jersey cadre. Aussi n'serveur web Java comme Tomcat ou Jetty support HTTP PATCH méthode? Je pourrais utiliser METTRE de la demande dans ce cas puisque je suis la modification de la ressource.Je suis désolé, je n'ai pas une vue d'ensemble qui récipient ou framework prend en charge
PATCH
.PUT
est une bonne idée, mais cela a l'inconvénient que vous devez envoyer l'ensemble de la ressource modifié.Merci. Pour des raisons de stabilité, je vais juste utiliser http
PUT
pour le moment et j'espère que httpPATCH
méthode sera officiellement inclus dans plus tard, Maillot de presse.OriginalL'auteur lefloh
Basé sur le code en Jersey 2.18 version, La classe
JerseyInvocation
utiliser un prédéfini HashMap pour valider la méthode HTTP et son Entité comme ci-dessous:C'est pourquoi nous avons eu cette erreur "Entité doit être nulle pour la méthode http SUPPRIMER".
Tout, veuillez noter qu'elle peut aussi fournir un Maillot de configuration du client de la propriété
ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION
pour déterminer s'il faut arrêter le reste de l'exécution ou pas, donc, ici, nous pouvons utiliser cette propriété pour supprimer la validation afin de continuer à envoyer unDELETE
demande de l'Entité. par exemple,Ma tentative pour remplacer org.glassfish.jersey.test.JerseyTest#configureClient avec ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION true a été transformé en un échec. Il n'y a pas d'exception mais au lieu de cela je v eu de réponse du service avec 400.
Je suis de la conversion d'une application serveur de Jeu Cadre de pure JavaEE et a eu une SUPPRESSION de la ressource qui a eu un JSON corps. Je ne peux pas briser l'ancienne API, donc cela m'a aidé!
OriginalL'auteur CarlJi
Juste pour remarque: si vous utilisez
resteasy
mise en œuvre deJAX RS Client API
, vous pouvez utiliserbuild().invoke()
:Mais il ne fonctionne pas avec
jersey
J'utilise resteasy mise en œuvre de JAX RS Client API. Et il fonctionne.
D'accord, mais l'OP question était liée à jersey client 🙂
OriginalL'auteur Alexandr
Vous pouvez utiliser
webTarget.request().accept(MediaType.TEXT_PLAIN).method("DELETE",yourEntity)
d'invoquer unDELETE
avec une entité en elle.Hmm, honnêtement, je ne m'attendais pas à ça. Si vous regardez [1] à la section 9.6, vous verrez que
DELETE
est destiné à être URI de base. Cela ne veut pas dire qu'il ne peut pas utiliser un corps bien.. [1]: w3.org/Protocols/rfc2616/rfc2616-sec9.htmlJe ne vois pas pourquoi SUPPRIMER la demande ne peut pas contenir de corps d'entité, soit à partir de la doc. Mais la javadoc (docs.oracle.com/javaee/7/api/javax/ws/rs/client/...) ne veut pas dire qu'il ne peut pas utiliser les SUPPRIMER, comme le nom de la méthode.
OriginalL'auteur John Ament