使用grails ws-lite 0.7.2.0,你可以指定一条通过soap发送的XML消息:
def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
body {
GetMothersDay(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
year(2011)
}
}
}
我需要做的是替换其中一个静态元素,例如" GetMothersDay"使用动态变量,例如:
String action = "GetMothersDay"
def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
body {
$action(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
year(2011)
}
}
}
显然上面的代码不会起作用,但希望它能说明我想要做的事情。
作为一个额外的问题,外面{}的东西是什么?它们是功能定义吗?例如什么是"年(2011)",它不能同时是函数定义和函数调用?
我需要替换位的实际XML消息更长,更复杂 - 但每次调用基本相同。
任何帮助都非常感激 - 如果没有办法做到这一点,我面临着数百行重复代码。
答案 0 :(得分:1)
如果表达式比一个变量更复杂并且包含空格或其他有问题的字符,请使用$action
或"$action"
而不是"${action}"
。
这些是方法调用,这通常是Groovy DSL /构建器的工作方式。它们显然不是有效的方法,但是方法缺失/属性缺失处理程序是活动的,只要您调用的方法对DSL有效,它们就会转换为您要构建的内容。通常,方法调用的名称和/或args用作数据并确定调用是否有效。
对于常规groovy.xml.MarkupBuilder
(例如in this example),包含Map参数的方法将成为具有从方法名称派生的名称的元素,并且Map项目将成为属性,例如
car(name:'P50', make:'Peel', year:1962)
到
<car name='P50' make='Peel' year='1962'>
使用String arg的方法调用成为具有String主体的元素,例如
country('Isle of Man')
变为
<country>Isle of Man</country>
您可以在the source of SOAPMessageBuilder.groovy中看到闭包的delegate
已设置为构建器,因此它可以处理调用,并使用MarkupBuilder
生成XML字符串。
Programming Groovy 2特别擅长在Groovy中创建DSL。