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>
的包装器,请注意在 XmlSlurper
中 root
节点从对象本身开始,因此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()
希望对您有所帮助,
我正在尝试在 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>
的包装器,请注意在 XmlSlurper
中 root
节点从对象本身开始,因此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()
希望对您有所帮助,