使用Jersey客户端代理

时间:2016-01-28 10:14:07

标签: java rest jersey jax-rs jersey-client

我使用Jersey 2.22来使用REST api。 该方法是契约优先,服务接口和包装器用于调用REST api(使用org.glassfish.jersey.client.proxy包)。

  

WebClient webClient = ClientBuilder.newClient();
  Web目标webTarget = webClient.getWebTarget(endPoint);
  ServiceClass proxy = WebResourceFactory.newResource(ServiceClass.class,webTarget);

  Object returnedObject = proxy.serviceMethod(“id1”);

问题是:如何获取底层HTTP响应(HTTP状态+正文)? 当returnedObject为null时,我需要分析响应以获取返回的错误消息,例如。 有办法吗?
我看到我们可以插入过滤器和拦截器来捕捉响应,但这不是我需要的。

1 个答案:

答案 0 :(得分:0)

您应该返回Response作为接口方法的结果而不是普通的DTO。

我不确定您期望的控制级别(考虑到您对@peeskillet评论的回复),但Response对象会让您有机会微调服务器的响应(标题,Cookie,状态等)并在客户端阅读所有这些内容 - 您可能会看到回复的成员,如getStatus()getHeaders()

这里唯一的问题是如何获得身体。为此,我建议您使用readEntity(Class<T>)(而不是getEntity()方法,因为我们可能会先尝试一下)。只要您注册了正确的媒体类型提供程序,就可以轻松地将实体提取为DTO类。

例如,如果您使用maven,jersey和JSON作为媒体类型,则可以添加以下依赖项(并将提供商的注册视为理所当然):

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
</dependency>

然后,使用以下命令对实体主体进行反序列化:

Response resp = proxy.serviceMethod("id1");
int status = resp.getStatus();
String statusText = resp.getStatusInfo();
String someHeader = resp.getHeaderString("SOME-HEADER");
YourCustomDTO obj = resp.readEntity(YourCustomDTO.class);

查询自定义对象列表(即方法返回JSON数组)时,请使用数组类型来读取正文。

Response resp = proxy.serviceMethodThatReturnsCollection();
YourCustomDTO[] obj = resp.readEntity(YourCustomDTO[].class);

请注意,在阅读正文后,流已关闭,尝试getEntity()可能会抛出异常。

希望它有所帮助。