web-dev-qa-db-fra.com

Utilisation du client Jersey pour effectuer une opération POST

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.

53
Jon Onstott

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?

81
brabster

À 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".

45
tonga

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);
13
otonglet

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);
5
dimuthu

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);
3
supercobra

Vous pouvez également essayer ceci:

MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
webResource.path("yourJerseysPathPost").queryParams(formData).post();
2
RVelarde