【问题标题】:reading JSON response as string using jersey client使用 jersey 客户端将 JSON 响应作为字符串读取
【发布时间】:2013-11-02 15:46:08
【问题描述】:

我正在使用 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) 什么也不返回。

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

【问题讨论】:

    标签: json string jersey response


    【解决方案1】:

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

       clientResp.bufferEntity();
       String x = clientResp.getEntity(String.class);
    

    【讨论】:

    • 此时正确的 Jersey 方法是 readEntity(String.class),而不是 getEntity(String.class)。
    【解决方案2】:

    虽然上述答案是正确的,但使用 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));
    

    【讨论】:

      【解决方案3】:

      如果你仍然有这个问题,你可以考虑使用rest-assured

      【讨论】:

      • 感谢您的回复。 REST-assured 似乎很有希望,但我只能在我的项目中使用 jersey 客户端。 :(
      【解决方案4】:

      就我而言,我使用的是 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;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多