我有一些带有方法签名的JAX-RS Web服务,如下所示。是否可以打印出来自客户端的原始JSON请求并将原始JSON响应返回给客户端?
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response XXX(@Context HttpServletRequest request, Parameters requestParameters) {
...
}
提前致谢。
最佳答案
可以通过请求过滤器为您完成。这是我的实现:
@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将请求流读入字符串。
对于我的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内容类型(坦率地说,我期望其他大多数内容类型也是如此)。
希望能有所帮助,
阿图尔