使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求相关的知识,希望对你有一定的参考价值。

我想记录整个请求和响应正文。出于记录目的,jax-rs具有过滤器。

public class ResponseLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // It's always empty string
        System.out.println(responseContext.getEntity().toString());  // Here is actual response. It's OK
    }
    public void filter(ContainerRequestContext requestContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // Here is actual response. But this request is empty in main code. 
    }
}

在响应过滤器我不能得到请求正文。在请求过滤器中我得到它但是:

  • 我无法获得请求正文和响应正文之间的链接。
  • 一旦从流设置请求正文设置此流为空,我无法在我的主代码中获取它。

我正在使用resteasy 3.0.6。

答案

1.请求和响应使用之间有联系:

@Override
    public void filter(ContainerRequestContext paramContainerRequestContext, ContainerResponseContext paramContainerResponseContext) throws IOException {
        ...     
    }
  1. 要将流返回到Main代码,请使用setEntityStream将其写回: ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = requestContext.getEntityStream(); final StringBuilder b = new StringBuilder(); try { ReaderWriter.writeTo(in, out); byte[] requestEntity = out.toByteArray(); ... requestContext.setEntityStream(new ByteArrayInputStream(requestEntity));

编辑

使用@Moritz Becker添加来自ClientLoggingFilter的请求正文和响应正文之间链接的注释示例:

@Override
    public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext)
            throws IOException {
        ...
        final Object requestId = requestContext.getProperty(LOGGING_ID_PROPERTY);
        final long id = requestId != null ? (Long) requestId : _id.incrementAndGet();

        final StringBuilder b = new StringBuilder();

        printResponseLine(b, "Client response received", id, responseContext.getStatus());
        printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getHeaders());

以上是关于使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 JAX-RS/RESTEasy 实现 CORS 的 Ajax 请求

JAX-RS + JBoss 7.1.1 + RESTEasy:使用 CDI 的 NullPointException

JAX-RS (Resteasy 3.5.0.Final) + Wildfly 12 + Java 9 + maven = 404 未找到,但 JAX-RS (Resteasy 3.5.0.Final

Spring-boot - 如何同时使用 Resteasy JAX-RS 和 Spring MVC 控制器

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

带有 Resteasy 的 JAX-RS:如何进行“超类”请求标头管理? [复制]