web-dev-qa-db-fra.com

Lire le corps de la réponse dans le client JAX-RS à partir d'une demande de publication

Avoir une sorte de proxy entre une application mobile et un service Web, nous sommes déconcertés par la réponse lors de l'émission d'une demande de publication. Nous recevons une réponse avec le statut 200: OK. Mais nous ne pouvons pas trouver/extraire le corps de la 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 fournir des astuces pour extraire le corps JSON (String) de la réponse du serveur?

59
user2657714

Essaye ça:

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

EDIT

Merci à @Martin Spamer de mentionner que cela fonctionnera uniquement avec les pots Jersey 1.x. Pour Jersey 2.x utiliser

String output = response.readEntity(String.class);
134
Juned Ahsan

Je viens de trouver une solution pour jaxrs-ri-2.16 - utilisez simplement

String output = response.readEntity(String.class)

cela fournit le contenu comme prévu.

14
col.panic

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 décrit dans la Impossible de simuler l'objet de réponse client Glassfish Jersey :

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

Le correctif consistait à transformer la ligne de code posant problème en:

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

J'ai également eu le même problème, en essayant d'exécuter un code d'appel de test unitaire qui utilise readEntity. Je ne peux pas utiliser getEntity dans le code de production car cela retourne simplement un ByteInputStream et non le contenu du corps. Il est donc impossible d'ajouter du code de production qui n'a été utilisé que dans les tests unitaires.

Ma solution consistait à créer une réponse, puis à utiliser un espion Mockito pour simuler la méthode readEntity:

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 renvoie le même objet IllegalStateException.

J'espère que cela t'aides!

4
Cheefachi

En réalisant la révision du code, j'ai trouvé la raison pour laquelle la méthode de lecture ne fonctionnait pas pour moi. Le problème était que l’une des dépendances pour lesquelles mon projet utilisait jersey 1.x. Mettez à jour la version, ajustez le client et cela fonctionne.

J'utilise la dépendance maven suivante:

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

Cordialement

Carlos Cepeda

0

Conformément à la documentation, la méthode getEntity dans Jax rs 2.0 renvoie un InputStream. Si vous devez convertir InputStream en String au format JSON, vous devez convertir les 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 implémenté cette méthode. Parce qu'une lecture dans différents blogs que beaucoup de développeurs ont le même problème avec la version en jaxrs en utilisant les méthodes suivantes

String output = response.readEntity(String.class)

et

String output = response.getEntity(String.class)

La première fonctionne avec le client jersey de la bibliothèque com.Sun.jersey et la seconde avec le client jersey de org.glassfish.jersey.core.

C'est l'erreur qui m'a été présentée: org.glassfish.jersey.client.internal.HttpUrlConnector $ 2 ne peut pas être converti en 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

0