11

我正在使用 jersey 客户端将文件发布到以 JSON 形式返回响应的 REST 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)什么也不返回。

有什么想法在这里可能不正确吗?

4

4 回答 4

19

我能够找到问题的解决方案。只需在 getEntity(String.class) 之前调用 bufferEntity 方法。这将作为字符串返回响应。

   clientResp.bufferEntity();
   String x = clientResp.getEntity(String.class);
于 2013-10-26T09:59:17.703 回答
10

尽管上述答案是正确的,但使用 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));
于 2016-02-09T16:26:05.000 回答
0

如果你仍然有这个问题,你可能要考虑使用放心

于 2013-10-25T01:55:32.117 回答
0

就我而言,我使用的是 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;
        }
    }
于 2020-03-03T04:36:53.673 回答