Dans une méthode Java, j'aimerais utiliser un objet client Jersey pour effectuer une opération POST sur un service Web RESTful (également écrit en utilisant Jersey) mais Je ne sais pas comment utiliser le client pour envoyer les valeurs qui seront utilisées comme FormParam sur le serveur. Je suis en mesure d'envoyer des paramètres de requête très bien.
Je ne l'ai pas encore fait moi-même, mais un petit peu de Google-Fu révèle un astuce technique sur blogs.Oracle.com avec des exemples exactement de ce que vous demandez.
Exemple tiré de l'article de blog:
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
ClientResponse response = webResource
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.post(ClientResponse.class, formData);
Que de l'aide?
À partir de Jersey 2.x, la classe MultivaluedMapImpl
est remplacée par MultivaluedHashMap
. Vous pouvez l'utiliser pour ajouter des données de formulaire et les envoyer au serveur:
WebTarget webTarget = client.target("http://www.example.com/some/resource");
MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
formData.add("key1", "value1");
formData.add("key2", "value2");
Response response = webTarget.request().post(Entity.form(formData));
Notez que l'entité de formulaire est envoyée au format "application/x-www-form-urlencoded"
.
C'est maintenant le premier exemple dans la documentation du client Jersey
Exemple 5.1. POST requête avec paramètres de formulaire
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9998").path("resource");
Form form = new Form();
form.param("x", "foo");
form.param("y", "bar");
MyJAXBBean bean =
target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
MyJAXBBean.class);
Si vous devez effectuer un téléchargement de fichier, vous devrez utiliser MediaType.MULTIPART_FORM_DATA_TYPE. Il semble que MultivaluedMap ne puisse pas être utilisé avec cela, alors voici une solution avec FormDataMultiPart.
InputStream stream = getClass().getClassLoader().getResourceAsStream(fileNameToUpload);
FormDataMultiPart part = new FormDataMultiPart();
part.field("String_key", "String_value");
part.field("fileToUpload", stream, MediaType.TEXT_PLAIN_TYPE);
String response = WebResource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part);
Le plus simple:
Form form = new Form();
form.add("id", "1");
form.add("name", "supercobra");
ClientResponse response = webResource
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.post(ClientResponse.class, form);
Vous pouvez également essayer ceci:
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
webResource.path("yourJerseysPathPost").queryParams(formData).post();