java 在JAX-RS客户机中从post请求读取响应体

omvjsjqw  于 2023-04-28  发布在  Java
关注(0)|答案(7)|浏览(146)

在移动的应用程序和Web服务之间有某种代理,我们对发布发布请求时的响应感到困惑。我们收到状态为200的响应:好的。但是我们无法找到/提取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。有人能提供一些提示来从服务器响应中提取JSON主体(String)吗?

3yhwsihp

3yhwsihp1#

试试这个:

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

编辑

感谢@Martin Spamer提到它将在Jersey 1工作。x jars新泽西2号。x使用

String output = response.readEntity(String.class);
xxslljrj

xxslljrj2#

我刚刚找到了jaxrs-ri-2的解决方案。16 -简单使用
String output = response.readEntity(String.class)
这如所期望的那样传递内容。

hsvhsicv

hsvhsicv3#

对于我的用例,前面的答案都不起作用,因为我正在编写一个服务器端单元测试,结果由于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();
vof42yt1

vof42yt14#

我也遇到了同样的问题,试图运行一个单元测试调用使用readEntity的代码。不能在产品代码中使用getEntity,因为它只返回ByteInputStream,而不是正文的内容,我不可能添加只在单元测试中命中的产品代码。
我的解决方案是创建一个响应,然后使用Mockito spy来模拟readEntity方法:

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

请注意,您不能使用when(mockResponse.readEntity(String.class)选项,因为这会抛出相同的IllegalStateException
希望这有帮助!

wrrgggsh

wrrgggsh5#

根据文档,方法getEntity在Jaxrs 2.0返回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的jersey-client。jersey库中找到,第二个是使用org的jersey-client找到的。glassfish.jersey.核心
这是我看到的错误:org.glassfish.jersey.client.internal.HttpUrlConnector$2不能强制转换为java。lang.String
我使用以下maven依赖项:

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

我不知道为什么readEntity方法不工作。我希望你能使用这个解决方案。
卡洛斯·塞佩达

ttisahbt

ttisahbt6#

意识到代码的修改,我找到了为什么阅读方法对我不起作用的原因。问题是我的项目使用的一个依赖项jersey1。x.更新版本,调整客户端,它的工作.
我使用以下maven依赖项:

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

问候
卡洛斯·塞佩达

khbbv19g

khbbv19g7#

Kotlin

使用Kotlin的相同版本的答案

(response.entity as InputStream).bufferedReader().use { it.readText() }

相关问题