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

ayant une sorte de procuration entre une application mobile et un service web, nous sommes intrigués par la réponse lors de l'émission d'une demande de poste. Nous recevons la 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 fournir quelques conseils pour extraire le corps JSON ( String ) de la réponse du serveur?

39
demandé sur Jens Piegsa 2013-08-06 21:24:40

4 réponses

essayez ceci:

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

MODIFIER

merci à @Martin Spamer pour avoir mentionné que ça va marcher pour Jersey 1.x pots. Pour Jersey 2.x utiliser

String output = response.readEntity(String.class);
102
répondu Juned Ahsan 2015-10-23 04:32:45

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

String output = response.readEntity(String.class)

cela délivre le contenu comme prévu.

12
répondu col.panic 2015-02-27 10:09:58

pour mon cas d'utilisation, aucune des réponses précédentes n'a fonctionné parce que je rédigeais un test d'unité côté serveur qui a échoué en raison du message d'erreur suivant comme décrit dans le incapable de moquerie Glassfish Jersey Client Response Object 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);

le correctif était de transformer la ligne de code de problème en:

String actJsonBody = (String) actResponse.getEntity();
4
répondu entpnerd 2017-05-23 11:55:05

j'ai aussi eu le même problème, en essayant d'exécuter un code d'appel de test d'unité qui utilise readEntity . Je ne peux pas utiliser getEntity dans le code de production parce que ça renvoie juste un ByteInputStream et pas le contenu du corps et il n'y a pas moyen que j'ajoute du code de production qui est frappé seulement dans les tests unitaires.

ma solution était de créer une réponse et ensuite utiliser un espion Mockito pour se moquer de 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 lance la même IllegalStateException .

Espérons que cette aide!

0
répondu Cheefachi 2017-10-20 14:40:52