我使用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时,我需要分析响应以获取返回的错误消息,例如。
有办法吗?
我看到我们可以插入过滤器和拦截器来捕捉响应,但这不是我需要的。
答案 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()
可能会抛出异常。
希望它有所帮助。