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 规范,对于此类通用内容,您将使用 @Webfilter
s。
这些 webfilters 可以获取整个请求和响应,包括状态代码,因为它们在传输级别而不是在应用程序级别工作。
请注意 servlet 规范很挑剔:如果不复制请求和响应,您将无法轻松读取它们,而且代码有点混乱。 Google 一点(记录 http 请求,记录 http 响应),您应该找到大量代码来创建可以执行此操作的过滤器。
我需要拦截应用程序的 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 规范,对于此类通用内容,您将使用 @Webfilter
s。
这些 webfilters 可以获取整个请求和响应,包括状态代码,因为它们在传输级别而不是在应用程序级别工作。
请注意 servlet 规范很挑剔:如果不复制请求和响应,您将无法轻松读取它们,而且代码有点混乱。 Google 一点(记录 http 请求,记录 http 响应),您应该找到大量代码来创建可以执行此操作的过滤器。