2014-09-23 63 views
2

我们有一个Spring方法来处理REST调用,根据我们使用的客户端(浏览器vs移动应用程序),我们遇到了一些问题。我们希望能够看到原始请求和标题,但无法弄清楚如何轻松地做到这一点。我们提出的最好的方法是将HttpServletRequest添加到方法中的参数中,并创建一个很长的方法来打印请求对象的各个部分。有没有更好的方法,比如打开一些特定的弹簧类的调试日志记录?如何记录Spring @RestController @RequestMapping方法的所有请求和头信息?

我们的方法的一个编辑的版本和printRequestInfo()方法是:

@RequestMapping(method = RequestMethod.POST, value = "/test/{testId}") 
public void doSomething(@PathVariable Long testId, 
     @RequestParam(value = "someOtherParam", required = false) String someOtherParam, 
     HttpServletRequest req) 
{ 
    printRequestInfo(req); 
    // ...   
} 

private void printRequestInfo(HttpServletRequest req) { 
    StringBuffer requestURL = req.getRequestURL(); 
    String queryString = req.getQueryString(); 

    if (queryString == null) { 
     logger.info("url: " + requestURL.toString()); 
    } else { 
     logger.info("url: " + requestURL.append('?').append(queryString).toString()); 
    } 

    logger.info("method:" + req.getMethod()); 

    // print all the headers 
    Enumeration headerNames = req.getHeaderNames(); 
    while(headerNames.hasMoreElements()) { 
     String headerName = (String)headerNames.nextElement(); 
     logger.info("header: " + headerName + ":" + req.getHeader(headerName)); 
    } 

    // print all the request params 
    Enumeration params = req.getParameterNames(); 
    while(params.hasMoreElements()){ 
     String paramName = (String)params.nextElement(); 
     logger.info("Attribute: '"+paramName+"', Value: '"+req.getParameter(paramName) + "'"); 
    } 
} 
+0

注册'AbstractRequestLoggingFilter'的一个子类并进行相应的配置。另见http://stackoverflow.com/questions/25905296/how-to-log-httprequest-and-httpresponse-in-a-file/25906059#25906059。 – 2014-09-23 17:58:29

回答

1

你提出的解决方案是多还是少,你可以用这个Servlet API(Spring的MVC是建立在做最好的,所以它不提供任何东西更多)。

根据您使用的是哪个Servlet容器,它们可能已经有了一个可以使用的实现。例如,Tomcat提供org.apache.catalina.filters.RequestDumperFilter请求和响应信息。

相关问题