這可以通過請求過濾器來完成。這是我的實施:
@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。
這些過濾器將在請求前後被調用。在打印來襲的身體之前,會打印響應身體。
因爲在響應過濾器執行時關閉了請求實體流,所以在響應過濾器中不要執行這兩個操作非常重要。
這是當你想打印你的身體,例如,像這樣:
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文件,看起來就像是:
[email protected]:~/tmp/test$ cat 1.json
{
"eventType": 1,
"params": {
"field1" : 10
}
}
我可以捲曲,看起來像這樣:
[email protected]:~/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內容類型(坦率地說大多數其他內容類型以及我期望的)。
希望幫助,
阿圖爾
回訪JSON'返回Response.ok(returnedJsonString,MediaType.APPLICATION_JSON).build();' –
你誤解了我的要求。我想打印出來自客戶端的JSON請求,並打印出返回給客戶端的JSON響應。例如,如果客戶端發送{「x」:「123」},那麼我希望能夠打印出這個確切的字符串,用於調試目的。 – user3573403