打印每个JAX-RS服务的JSON请求/响应

时间:2016-08-03 09:31:11

标签: java json jax-rs

我有一些带有方法签名的JAX-RS Web服务,如下所示。是否可以打印出来自客户端的原始JSON请求以及返回给客户端的原始JSON响应?

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response XXX(@Context HttpServletRequest request, Parameters requestParameters) {
    ...
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

这可以通过请求过滤器为您完成。这是我的实施:

@Path("test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloResource {

    private static final Logger log = Logger.getLogger(HelloResource.class);

    @POST
    @Path("/test")
    public Response test(String body) {
        Map<String, String> tmp = new HashMap<>();
        tmp.put("test", "value");
        return Response.ok(tmp).build();
    }

}

用于测试的资源。只需将身体作为一个字符串。

现在您可以注册ContainerResponseFilter和ContainerRequestFilter。

将在请求之前和之后调用这些过滤器。之前会打印传入的物体,之后会打印响应体。

重要的是不要在响应过滤器中同时执行这两者,因为请求实体Stream在执行响应过滤器时关闭。

那时你想要打印你的身体,例如像这样:

public class PrintFilter implements ContainerResponseFilter, ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {


        System.out.println("Response body: " + responseContext.getEntity());
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        String string = IOUtils.toString(requestContext.getEntityStream());
        System.out.println("request body: " + string);
    }


}

我正在使用apache-commons将请求Stream读入String。

对于我的json文件,看起来像这样:

artur@pandaadb:~/tmp/test$ cat 1.json 
{
  "eventType": 1,
  "params": {
    "field1" : 10
  }
}

我可以卷曲,看起来像这样:

artur@pandaadb:~/tmp/test$ curl -XPOST "localhost:9085/api/test/test" -H "Content-Type: application/json" --data @1.json 
{"test":"value"}

将打印到我的控制台:

request body: {  "eventType": 1,  "params": {    "field1" : 10  }}
Response body: {test=value}

这显然只是众多解决方案中的一种。这适用于所有json内容类型(坦率地说,大多数其他内容类型也是我所期望的)。

希望有所帮助,

Artur