87

在移动应用程序和 Web 服务之间有某种代理,我们对发出 post 请求时的响应感到困惑。我们收到状态为 200 的响应:OK。但我们无法找到/提取 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));

我们正在使用 JAX-RS。有人可以提供一些提示以String从服务器响应中提取 JSON 正文()吗?

4

6 回答 6

196

尝试这个:

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

编辑

感谢@Martin Spamer提到它仅适用于 Jersey 1.x jar。对于 Jersey 2.x 使用

String output = response.readEntity(String.class);
于 2013-08-06T17:26:46.500 回答
21

我刚刚找到了 jaxrs-ri-2.16 的解决方案 - 只需使用

String output = response.readEntity(String.class)

这将按预期交付内容。

于 2015-02-27T10:09:58.853 回答
15

对于我的用例,以前的答案都不起作用,因为我正在编写一个服务器端单元测试,该测试由于以下错误消息而失败,如Unable to Mock Glassfish Jersey Client Response Object问题中所述:

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

此异常发生在以下代码行:

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

解决方法是将问题代码行变成:

String actJsonBody = (String) actResponse.getEntity();
于 2016-08-05T21:22:51.783 回答
4

我也有同样的问题,试图运行一个单元测试调用代码,它使用readEntity. 不能getEntity在生产代码中使用,因为它只返回 aByteInputStream而不是正文的内容,而且我无法添加仅在单元测试中命中的生产代码。

我的解决方案是创建一个响应,然后使用 Mockito 间谍来模拟该readEntity方法:

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

请注意,您不能使用该when(mockResponse.readEntity(String.class)选项,因为它会抛出相同的IllegalStateException.

希望这可以帮助!

于 2017-10-20T14:40:52.007 回答
0

实现代码的修改,我找到了为什么阅读方法对我不起作用的原因。问题是我的项目使用 jersey 1.x 的依赖项之一。更新版本,调整客户端,就可以了。

我使用以下 Maven 依赖项:

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>

问候

卡洛斯·塞佩达

于 2019-04-01T17:31:21.043 回答
0

根据文档,Jax rs 2.0 中的方法 getEntity 返回一个 InputStream。如果需要将 InputStream 转换为 JSON 格式的 String,则需要对这两种格式进行强制转换。例如在我的例子中,我实现了下一个方法:

    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;
}

为什么我实现了这个方法。因为在不同的博客中阅读了许多开发人员,他们在使用下一个方法的 jaxrs 版本中遇到了相同的问题

String output = response.readEntity(String.class)

String output = response.getEntity(String.class)

第一个使用来自 com.sun.jersey 库的 jersey-client,第二个使用来自 org.glassfish.jersey.core 的 jersey-client。

这是呈现给我的错误:org.glassfish.jersey.client.internal.HttpUrlConnector$2 cannot be cast to java.lang.String

我使用以下 Maven 依赖项:

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>

我不知道为什么 readEntity 方法不起作用。希望您可以使用该解决方案。

卡洛斯·塞佩达

于 2019-04-01T14:48:20.897 回答