我正在使用jersey客户端将文件发布到REST URI,该URI以json返回响应。我的要求是将响应原样读取为字符串。
这里是将数据发布到Web服务的代码段。
final ClientResponse clientResp = resource.type(
MediaType.MULTIPART_FORM_DATA_TYPE).
accept(MediaType.APPLICATION_JSON).
post(ClientResponse.class, inputData);
System.out.println("Response from news Rest Resource : " + clientResp.getEntity(String.class)); // This doesnt work.Displays nothing.
clientResp.getLength()有281个字节,它是响应的大小,但是clientResp.getEntity(String.class)不返回任何内容。
任何想法在这里可能不正确吗?
我能够找到解决问题的方法。只需在getEntity(String.class)之前调用bufferEntity方法。这将以字符串形式返回响应。
clientResp.bufferEntity();
String x = clientResp.getEntity(String.class);
尽管以上答案是正确的,但使用Jersey API v2.7,它与Response
略有不同:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080");
Response response = target.path("api").path("server").path("ping").request(MediaType.TEXT_PLAIN_TYPE).get();
System.out.println("Response: " + response.getStatus() + " - " + response.readEntity(String.class));
如果对此仍然有疑问,则可能要考虑使用rest-assured
就我而言,我使用的是Jersey 1.19,而Genson却以某种方式进入了我的课堂?因此,接受的答案将引发com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String
。
我的解决方案是直接从响应流中读取:
private String responseString(com.sun.jersey.api.client.ClientResponse response) {
InputStream stream = response.getEntityInputStream();
StringBuilder textBuilder = new StringBuilder();
try (Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName(StandardCharsets.UTF_8.name())))) {
int c = 0;
while ((c = reader.read()) != -1) {
textBuilder.append((char) c);
}
return textBuilder.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}