繁体   English   中英

使用Jersey客户端代理时访问HTTP响应

[英]Access HTTP response when using Jersey client proxy

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

WebClient webClient = ClientBuilder.newClient();
WebTarget webTarget = webClient.getWebTarget(endPoint);
ServiceClass代理= WebResourceFactory.newResource(ServiceClass.class,webTarget);

对象返回Object = proxy.serviceMethod(“ id1”);

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

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

我不确定您期望的控制级别(考虑对@peeskillet评论的答复),但是Response对象将使您有机会微调服务器的响应(标题,cookie,状态等)并阅读所有这些都在客户端-如您所见,可以看看Response的成员,例如getStatus()getHeaders()

这里唯一的陷阱是如何获得身体。 为此,我会告诉您使用readEntity(Class<T>) (而不是getEntity()最初可能尝试的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()可能会引发异常。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM