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

Java interceptor to process the REST API response code

我需要拦截应用程序的 REST API 响应并对其进行处理。实现此目的的一种非常明显的方法是在方法级别定义注释和拦截器(以便它可以应用于 REST API 方法)。但是,我找不到 extract/intercept API 响应的响应代码的方法。我是 Java EE 世界的新手,所以这里可能遗漏了一些东西,但在互联网搜索中也没有找到任何东西。我们的应用程序基于带有 CXF 的标准 JavaEE。

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

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

假设您正在使用来自 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(); 是适合您的结果。

您好,您没有提到什么技术栈。如果您需要客户端的东西,您可以使用 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;
}

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
    }
}

要将过滤器绑定到资源 类 and/or 方法,请使用 .

正在 Apache CXF 中注册服务器过滤器

根据 Apache CXF documentation,过滤器必须在 cxf.xml 配置文件中注册。此文件必须位于您的应用程序的类路径中。

这是从 documentation 中提取的示例,说明注册过滤器时您的 CXF 配置文件可能是什么样子:

<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

尽管拦截器是为应用程序 services 处理横切关注点的好方法,但您在这里谈论的是 web 应用程序.您不是在查看拦截 service 请求,而是在查看拦截 http 请求。

Web 应用程序使用 servlet 规范,对于此类通用内容,您将使用 @Webfilters。 这些 webfilters 可以获取整个请求和响应,包括状态代码,因为它们在传输级别而不是在应用程序级别工作。

请注意 servlet 规范很挑剔:如果不复制请求和响应,您将无法轻松读取它们,而且代码有点混乱。 Google 一点(记录 http 请求,记录 http 响应),您应该找到大量代码来创建可以执行此操作的过滤器。