Da wir eine Art Proxy zwischen einer mobilen App und einem Webdienst haben, sind wir verwirrt über die Antwort bei der Ausgabe einer Post-Anfrage. Wir erhalten eine Antwort mit dem Status 200: OK. Der JSON-Antworttext kann jedoch nicht gefunden / extrahiert werden.
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));
Wir verwenden JAX-RS. Kann jemand bitte einige Hinweise geben, um den JSON-Body ( String
) aus der Serverantwort zu extrahieren ?
String output = response.readEntity(String.class);
Damit es funktioniert. Danke vielmals!Antworten:
Versuche dies:
BEARBEITEN
Vielen Dank an @Martin Spamer , dass es nur für Jersey 1.x Gläser funktioniert. Für Jersey 2.x verwenden
quelle
response.readEntity(String.class);
org.glassfish.jersey.client.HttpUrlConnector$2@1255b1d1
als Ausgabe.com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String
den Antwortstrom manuell lesen müssen , wenn Sie eine erhalten , um die JSON-Zeichenfolge abzurufen. Das ist mir mit Jersey 1.19 passiert.Ich habe gerade eine Lösung für jaxrs-ri-2.16 gefunden - einfach verwenden
String output = response.readEntity(String.class)
Dies liefert den Inhalt wie erwartet.
quelle
Für meinen Anwendungsfall funktionierte keine der vorherigen Antworten, da ich einen serverseitigen Komponententest schrieb, der aufgrund der folgenden Fehlermeldung fehlschlug, wie in der Frage " Client-Antwortobjekt für Glassfish Jersey kann nicht verspottet werden" beschrieben :
java.lang.IllegalStateException: Method not supported on an outbound message. at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:145) at ...
Diese Ausnahme trat in der folgenden Codezeile auf:
Die Lösung bestand darin, die Problemcodezeile in Folgendes umzuwandeln:
quelle
Ich hatte auch das gleiche Problem, als ich versuchte, einen Unit-Test-Aufrufcode auszuführen, der verwendet
readEntity
. Kann nichtgetEntity
im Produktionscode verwendet werden, da dies nur einByteInputStream
und nicht den Inhalt des Körpers zurückgibt und ich auf keinen Fall Produktionscode hinzufügen kann, der nur in Komponententests getroffen wird.Meine Lösung bestand darin, eine Antwort zu erstellen und dann einen Mockito-Spion zu verwenden, um die
readEntity
Methode zu verspotten :Response error = Response.serverError().build(); Response mockResponse = spy(error); doReturn("{jsonbody}").when(mockResponse).readEntity(String.class);
Beachten Sie, dass Sie die
when(mockResponse.readEntity(String.class)
Option nicht verwenden können, da dies dasselbe auslöstIllegalStateException
.Hoffe das hilft!
quelle
Gemäß der Dokumentation gibt die Methode getEntity in Jax rs 2.0 einen InputStream zurück. Wenn Sie in InputStream in String mit JSON-Format konvertieren müssen, müssen Sie die beiden Formate umwandeln. In meinem Fall habe ich beispielsweise die nächste Methode implementiert:
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; }
warum ich diese Methode implementiert habe. Da in verschiedenen Blogs gelesen wird, dass viele Entwickler das gleiche Problem mit der Version in jaxrs haben, verwenden sie die nächsten Methoden
und
Der erste funktioniert mit dem Trikot-Client aus der Bibliothek com.sun.jersey und der zweite mit dem Trikot-Client aus org.glassfish.jersey.core.
Dies ist der Fehler, der mir angezeigt wurde: org.glassfish.jersey.client.internal.HttpUrlConnector $ 2 kann nicht in java.lang.String umgewandelt werden
Ich benutze die folgende Maven-Abhängigkeit:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.28</version>
Was ich nicht weiß, ist, warum die readEntity-Methode nicht funktioniert. Ich hoffe, Sie können die Lösung verwenden.
Carlos Cepeda
quelle
Als ich die Überarbeitung des Codes erkannte, fand ich die Ursache dafür, dass die Lesemethode bei mir nicht funktionierte. Das Problem war, dass eine der Abhängigkeiten, die mein Projekt verwendete, Trikot 1.x. Aktualisieren Sie die Version, passen Sie den Client an und es funktioniert.
Ich benutze die folgende Maven-Abhängigkeit:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.28</version>
Grüße
Carlos Cepeda
quelle