有没有办法从Jersey的javax.ws.rs.Client获取请求信息?

时间:2017-07-25 17:30:46

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

我正在尝试为在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,但没有运气。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

您可以查看ClientLoggingFilterLoggingInterceptor的来源,以获得有关实施的一些建议。

1 - 它需要使用拦截器,而不是仅仅使用过滤器来处理所有内容,因为过滤器只会为您提供预先加载的对象,它可以是任何东西,很难记录。使用输入流进行通用日志记录更容易。

2 - 请参阅Filters and Interceptors