example java json web-services cxf jax-rs

java - example - Leer el cuerpo de respuesta en el cliente JAX-RS desde una solicitud posterior



cxf rest spring (4)

Acabo de encontrar una solución para jaxrs-ri-2.16 - simplemente use

String output = response.readEntity(String.class)

esto entrega el contenido como se esperaba.

Teniendo algún tipo de proxy entre una aplicación móvil y un servicio web, la respuesta nos deja perplejos al emitir una solicitud posterior. Recibimos respuesta con estado 200: OK. Pero no podemos encontrar / extraer el cuerpo de respuesta 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));

Estamos usando JAX-RS. ¿Puede alguien dar algunas pistas para extraer el cuerpo JSON ( String ) de la respuesta del servidor?


Para mi caso de uso, ninguna de las respuestas anteriores funcionó porque estaba escribiendo una prueba de unidad del lado del servidor que estaba fallando debido al siguiente mensaje de error como se describe en la pregunta del Objeto de respuesta del cliente de Glassfish Jersey Incapaz de simular :

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

Esta excepción ocurrió en la siguiente línea de código:

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

La solución fue convertir la línea de problema del código en:

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


Prueba esto:

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

EDITAR

Gracias a @Martin Spamer por mencionar que solo funcionará para los frascos Jersey 1.x. Para el uso de Jersey 2.x

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


También tuve el mismo problema al tratar de ejecutar un código de llamada de prueba de unidad que utiliza readEntity . No se puede usar getEntity en el código de producción porque eso solo devuelve un ByteInputStream y no el contenido del cuerpo y no hay manera de que agregue código de producción que solo se golpea en las pruebas unitarias.

Mi solución fue crear una respuesta y luego usar un espía Mockito para burlar el método readEntity :

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

Tenga en cuenta que no puede usar la opción when(mockResponse.readEntity(String.class) porque arroja la misma IllegalStateException .

¡Espero que esto ayude!