用于处理REST API响应代码的Java拦截器

时间:2016-09-30 07:43:28

标签: java rest http interceptor

我需要拦截外部应用程序的REST API响应并对它们执行某些操作。实现此目的的一个非常明显的方法是在方法级别定义注释和拦截器(以便它可以应用于REST API方法)。但是,我找不到提取/拦截API响应的响应代码的方法。我是Java EE世界的新手,所以可能在这里遗漏了一些东西,但在互联网搜索上也找不到任何东西。我们的应用程序基于标准的JavaEE和CXF。

我看过一些代码类似于以下的示例,但不确定如何从中获取API响应。任何帮助将不胜感激。

@AroundInvoke
public Object around(InvocationContext context) throws Exception {......

4 个答案:

答案 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服务器过滤器

使用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中注册服务器过滤器

根据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;
}