我需要拦截外部应用程序的REST API响应并对它们执行某些操作。实现此目的的一个非常明显的方法是在方法级别定义注释和拦截器(以便它可以应用于REST API方法)。但是,我找不到提取/拦截API响应的响应代码的方法。我是Java EE世界的新手,所以可能在这里遗漏了一些东西,但在互联网搜索上也找不到任何东西。我们的应用程序基于标准的JavaEE和CXF。
我看过一些代码类似于以下的示例,但不确定如何从中获取API响应。任何帮助将不胜感激。
@AroundInvoke
public Object around(InvocationContext context) throws Exception {......
答案 0 :(得分:3)
假设您使用的是doc
中的标准JEE解决方案@AroundInvoke
public Object logInvocation(InvocationContext ctx) throws Exception {
String class = ctx.getMethod().getDeclaringClass().getName();
String method = ctx.getMethod().getName();
Logger.global.entering(class, method, ctx.getParameters());
try {
Object result = ctx.proceed();
Logger.global.exiting(class, method, result);
return result;
}
catch (Exception e) {
Logger.global.throwing(class, method, e);
throw e;
}
}
Object result = ctx.proceed();
是你的结果。
答案 1 :(得分:1)
使用JAX-RS API 2.0中的ContainerResponseFilter
拦截响应或服务器端:
@Provider
public class CustomResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
// Intercept the HTTP response and get the status code
int status = responseContext.getStatus()
}
}
JAX-RS 2.0 API还提供ContainerRequestFilter
来拦截请求:
@Provider
public class CustomRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Intercept the HTTP request
}
}
要将过滤器绑定到资源类和/或方法,请使用name binding annotations。
根据Apache CXF documentation,过滤器必须在cxf.xml
配置文件中注册。此文件必须位于应用程序的类路径中。
以下是从注册过滤器时CXF配置文件的documentation中提取的示例:
<beans>
<jaxrs:server id="customerService" address="/">
<jaxrs:serviceBeans>
<bean class="org.CustomerService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="authorizationFilter" />
</jaxrs:providers>
<bean id="authorizationFilter" class="com.bar.providers.AuthorizationFilter">
<!-- authorization bean properties -->
</bean>
</jaxrs:server>
</beans>
有关详细信息,请查看CXF documentation about configuration。
答案 2 :(得分:1)
虽然拦截器是对您的应用程序服务进行横切关注的好方法,但您在这里谈论的是 web 应用程序。您不是在考虑拦截服务请求,而是在考虑拦截 http 请求。
Web应用程序使用servlet规范,对于此类通用内容,您使用@Webfilter
s。
这些Web过滤器可以获取整个请求和响应,包括状态代码,因为它们在传输级别上工作,而不是在应用程序级别上工作。
请注意servlet规范是挑剔的:你不能轻易地读取请求和响应而不重复它们,并且代码有点混乱。谷歌有点为它(日志http请求,日志http响应),你应该找到大量的代码来创建一个可以做到这一点的过滤器。
答案 3 :(得分:0)
嗨,你没有提到什么技术堆栈。如果你需要客户端的东西,你可以使用Spring和Spring的ClientHttpRequestInterceptor。
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
ClientHttpResponse response = execution.execute(request, body);
/**
* response.getStatusCode();
*/
return response;
}