90 votes

Lire le corps de la réponse dans le client JAX-RS à partir d'une requête post.

Ayant une sorte de proxy entre une application mobile et un service web, nous sommes perplexes quant à la réponse lors de l'émission d'une requête post. Nous recevons une réponse avec le statut 200 : OK, mais nous ne pouvons pas trouver/extraire le corps de réponse JSON.

    Client client = ClientBuilder.newClient();
    WebTarget webTarget = client.target(WEBSERVICE_BASE_LOCATION + "mobileDevices?operatorCode=KPNSCP");
    String jsonString = "{\"osVersion\":\"4.1\",\"apiLevel\":16,\"devicePlatform\":\"ANDROID\"}";
    Builder builder = webTarget.request();
    Response response = builder.post(Entity.json(jsonString));

Nous utilisons JAX-RS. Quelqu'un peut-il nous donner quelques conseils pour extraire le corps JSON ( String ) de la réponse du serveur ?

200voto

Juned Ahsan Points 33217

Essayez ça :

String output = response.getEntity(String.class);

EDIT

Merci à Martin Spamer de mentionner qu'il ne fonctionnera que pour les jarres Jersey 1.x. Pour Jersey 2.x, utilisez

String output = response.readEntity(String.class);

22voto

col.panic Points 865

Je viens de trouver une solution pour jaxrs-ri-2.16 - il suffit d'utiliser

String output = response.readEntity(String.class)

le contenu est livré comme prévu.

15voto

entpnerd Points 885

Pour mon cas d'utilisation, aucune des réponses précédentes n'a fonctionné car j'écrivais un test unitaire côté serveur qui échouait en raison du message d'erreur suivant, tel que décrit dans l'article de l'article de loi sur la protection des données. Impossible de simuler l'objet de réponse du client Glassfish Jersey question :

java.lang.IllegalStateException: Method not supported on an outbound message.
at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:145)
at ...

Cette exception s'est produite sur la ligne de code suivante :

String actJsonBody = actResponse.readEntity(String.class);

La solution consistait à transformer la ligne de code problématique en :

String actJsonBody = (String) actResponse.getEntity();

4voto

Cheefachi Points 95

J'ai également eu le même problème, en essayant d'exécuter un test unitaire appelant un code qui utilise readEntity . On ne peut pas utiliser getEntity dans le code de production parce que cela renvoie simplement un ByteInputStream et non le contenu du corps et il est hors de question que j'ajoute du code de production qui n'est utilisé que dans les tests unitaires.

Ma solution a consisté à créer une réponse, puis à utiliser un espion Mockito pour simuler l'utilisation de la fonction readEntity méthode :

Response error = Response.serverError().build();
Response mockResponse = spy(error);
doReturn("{jsonbody}").when(mockResponse).readEntity(String.class);

Notez que vous ne pouvez pas utiliser l'option when(mockResponse.readEntity(String.class) car elle jette le même IllegalStateException .

J'espère que cela vous aidera !

0voto

D'après la documentation, la méthode getEntity de Jax rs 2.0 renvoie un InputStream. Si vous avez besoin de convertir l'InputStream en String au format JSON, vous devez faire un casting des deux formats. Par exemple dans mon cas, j'ai implémenté la méthode suivante :

    private String processResponse(Response response) {
    if (response.getEntity() != null) {
        try {
            InputStream salida = (InputStream) response.getEntity();
            StringWriter writer = new StringWriter();
            IOUtils.copy(salida, writer, "UTF-8");
            return writer.toString();
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        }
    }
    return null;
}

pourquoi j'ai mis en place cette méthode. Parce que j'ai lu dans différents blogs que de nombreux développeurs ont le même problème avec la version de jaxrs en utilisant les méthodes suivantes

String output = response.readEntity(String.class)

et

String output = response.getEntity(String.class)

Le premier fonctionne en utilisant le jersey-client de la bibliothèque com.sun.jersey et le second en utilisant le jersey-client de org.glassfish.jersey.core.

Voici l'erreur qui m'a été présentée : org.glassfish.jersey.client.internal.HttpUrlConnector$2 cannot be cast to java.lang.String

J'utilise la dépendance maven suivante :

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>

Ce que je ne sais pas, c'est pourquoi la méthode readEntity ne fonctionne pas.j'espère que vous pourrez utiliser la solution.

Carlos Cepeda

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X