转储原始XML以调试Grails REST调用

时间:2011-08-17 16:58:54

标签: xml grails

我们需要转储原始XML,以便在Grails 1.2应用上解决数据相关问题。在UrlMappings中,我们有“parseRequest:true”。以下不能得到我正在寻找的,任何其他选择?请注意,我们需要在生产机器上使用它,因此适合开发的小提琴或类似的基于代理的解决方案不是一种选择

def beforeInterceptor = {
    println "#"*99
    println "Executing action $actionName with params=$params"
    println request.inputStream.dump()
    //println request.inputStream.text // java.io.IOException: Stream closed
    println request.XML
}

2 个答案:

答案 0 :(得分:2)

如果我没记错的话,当你执行request.XML时,你应该收到一个XmlSlurper对象。所以这个应该得到你想要的东西。

def beforeInterceptor = {
   def xml = request.XML
   def xmlString = new XmlNodePrinter(new PrintWriter(new StringWriter())).print(xml)
}

答案 1 :(得分:1)

事实证明request.XML的类型为groovy.util.slurpersupport.NodeChild,它有一个糟糕的toString()覆盖。所以解决方案是here,将其放在 bootstrap

NodeChild.metaClass.toXmlString = {
    def self = delegate
    new StreamingMarkupBuilder().bind {
        delegate.mkp.xmlDeclaration() // Use this if you want an XML declaration
        delegate.out << self
    }.toString()
}

这在控制器中:

def beforeInterceptor = {
    println "#"*99
    log.info "REST CALL [${request.serverName}${request.forwardURI}?${request.queryString}] with [$request.method] action [$actionName]"
    println request.XML.toXmlString()
}