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