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?
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);
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.
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();
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!