soapUI 动态模拟服务:如何从请求参数中提取响应名称?

soapUI Dynamic mock service: How to extract response name from request parameter?

我正在尝试在 SoapUI 中构建一个模拟服务,该服务会根据请求中传递的值动态 return 响应。示例:

<foo>
     <bar>
        <ID>Response1</ID>  <--- I want to extract this
        <ReferenceID>stuff</ReferenceID>
        <CreationDate>2016-05-01T11:34:56Z</CreationDate>
     </bar>
</foo>

所以我将 DISPATCH 设置为 SCRIPT 并尝试了以下操作(return 值应指定响应的名称,即 returned):

def req = new XmlSlurper().parseText(mockRequest.requestContent)
return "${req.foo.bar.ID}"

还有这个:

def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent )
def arg1 = holder.getNodeValue("ID") // also tried "//ID"
return arg1.toString();

都没有用,模拟总是 return 默认响应 - 希望你们中的一些人能帮助我解决问题:)

问题可能是您的 <foo> 响应包含在 SOAP<envelope><body> 中,因此您使用的路径XmlSlurper 不正确 req.foo.bar.ID

此外,如果在您的情况下您的响应不是 <envelope><body> 的包装器,请注意在 XmlSlurperroot 节点从对象本身开始,因此req.foo 不需要,因为 <foo> 是根节点,看下面的例子:

def xml = 
'''<foo>
     <bar>
        <ID>Response1</ID>
        <ReferenceID>stuff</ReferenceID>
        <CreationDate>2016-05-01T11:34:56Z</CreationDate>
     </bar>
</foo>
'''

def slurper = new XmlSlurper().parseText(xml)
println slurper.foo // prints nothing...
println slurper.bar.ID // prints Response1

因此,获取节点值的简单方法可能是使用 find 方法,因此在您的 DISPATCH 脚本中:

def req = new XmlSlurper().parseText(mockRequest.requestContent)
return req.'**'.find { it.name() == 'ID' }

或者,如果您想使用 XmlHolder 而不是 XmlSlurper 作为@Rao 注释,只需在您的 XPath 上使用命名空间即可。幸运的是 SOAPUI 允许您使用 * 作为名称空间的通配符,因此 //*:ID:

更正了 ID
def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent )
return holder.getNodeValue("//*:ID").toString()

希望对您有所帮助,