【问题标题】:Is there a way to obtain the request information from javax.ws.rs.Client in Jersey?有没有办法从 Jersey 的 javax.ws.rs.Client 获取请求信息?
【发布时间】:2017-07-25 17:30:45
【问题描述】:

我正在尝试为基于 jersey 构建的项目制定日志记录标准,并且我想提供一种简单的方法来记录请求信息和响应,以防发生异常。以下代码说明了我的想法:

    Client client = null;
    Response response = null;
    try {
        client = ClientBuilder.newClient();
        response = client.target("<URL>")
                .request(MediaType.APPLICATION_JSON)
                .post(entity);
    } catch( Exception ex) {
        //Send information for exception mapping to a JSON log
        throw new ServiceException( client,response );
    }

问题是如何在我的ServiceException 类中获得以下内容:

    String url = client.getUri().toString(); //only one I could get using WebTarget
    MultivaluedMap<String, String> headers = client.getHeaders();
    String body = client.getEntity();
    MultivaluedMap<String, String> queryParams = client.getQueryParams();    
    String method = client.getMethod();

我尝试访问WebTarget,但没有成功。

提前致谢!

【问题讨论】:

    标签: java web-services jersey jax-rs jersey-2.0


    【解决方案1】:

    Jersey 的客户端和服务器端都有logging support。该文档显示了如何使用Client 注册它。也可以通过WebtTarget注册。

    如果您对结果不满意,并且想要实现自己的结果,我会以与 Jersey 相同的方式实现它:结合 WriterInterceptor 来记录请求实体流1Client(Request|Response)Filter2 以获取请求和响应的其他部分(如标头和请求行)。

    您可以查看ClientLoggingFilterLoggingInterceptor 的源代码,以获取有关您的实施的一些想法。


    1 - 它需要使用拦截器,而不是只对所有内容使用过滤器,因为过滤器只会给你预序列化的对象,它可以是任何东西,这很难记录。使用输入流进行通用日志记录更容易

    2 - 见Filters and Interceptors

    【讨论】:

    • 是的,经过几天的寻找,似乎我无法避免每次通话时的过滤器注册或制作相同的包装器,谢谢您指出球衣的来源,我会看看!
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多