从post请求中读取JAX-RS客户端中的响应主体

use*_*714 63 java json web-services cxf jax-rs

在移动应用程序和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));
Run Code Online (Sandbox Code Playgroud)

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

Jun*_*san 141

试试这个:

String output = response.getEntity(String.class);
Run Code Online (Sandbox Code Playgroud)

编辑

感谢@Martin Spamer提到它只适用于Jersey 1.x罐子.对于Jersey 2.x使用

String output = response.readEntity(String.class);
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于来自Jersey的Jax 1.x:OP正在使用的2.x以上(我们可以从他对ClientBuilder.newClient()的使用中得知).响应是`response.readEntity(String.class);` (44认同)
  • 这对jaxrs-ri-2.16不起作用,在这里输出``org.glassfish.jersey.client.HttpUrlConnector $ 2 @ 1255b1d1```. (3认同)

col*_*nic 16

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

String output = response.readEntity(String.class)

这按预期提供内容.

  • 泽西开发商让我发疯.每个版本的方法命名和/或整个工作流程都会发生巨大变化.这就像玩Miner游戏一样.从头开始查找所有地雷. (14认同)
  • @Whimusical我认为他喜欢向后兼容:) (6认同)
  • 你不喜欢敏捷吗?:) (2认同)

ent*_*erd 10

对于我的用例,之前的答案都没有起作用,因为我正在编写一个服务器端单元测试,由于无法模拟Glassfish Jersey客户端响应对象问题中描述的以下错误消息而失败:

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

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

String actJsonBody = actResponse.readEntity(String.class);
Run Code Online (Sandbox Code Playgroud)

解决方法是将问题代码行转换为:

String actJsonBody = (String) actResponse.getEntity();
Run Code Online (Sandbox Code Playgroud)

  • getEntity不会自动读取任何支持InputStream,所以要小心. (3认同)