2016-08-03 42 views
2

我有一些JAX-RS網絡服務,其方法簽名如下所示。是否可以打印出來自客戶端的原始JSON請求和返回給客戶端的原始JSON響應?打印每個JAX-RS服務的JSON請求/響應

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

在此先感謝。

+0

回訪JSON'返回Response.ok(returnedJsonString,MediaType.APPLICATION_JSON).build();' –

+0

你誤解了我的要求。我想打印出來自客戶端的JSON請求,並打印出返回給客戶端的JSON響應。例如,如果客戶端發送{「x」:「123」},那麼我希望能夠打印出這個確切的字符串,用於調試目的。 – user3573403

回答

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。

這些過濾器將在請求前後被調用。在打印來襲的身體之前,會打印響應身體。

因爲在響應過濾器執行時關閉了請求實體流,所以在響應過濾器中不要執行這兩個操作非常重要。

這是當你想打印你的身體,例如,像這樣:

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內容類型(坦率地說大多數其他內容類型以及我期望的)。

希望幫助,

阿圖爾

+0

謝謝pandaadb。您的請求部分適合我。對於響應部分,它沒有記錄確切的JSON響應。我懷疑是否有可能將確切的JSON響應記錄到客戶端。無論如何,請求日誌對我來說更重要,您的解決方案已經足夠好了。 – user3573403

+0

Hi @ user3573403請確保在使用過濾器中的INputstream並打印之後,將其設置回請求。一個數據流只能被讀取一次,您可能需要在讀取數據後爲其創建一個新的數據流。請調試並確保資源正在檢索您期望的內容! – pandaadb