我在泡菜中。 我觉得我想要实现的目标有一个简单的解决方案,但我不知道如何去做。
基本上,我正在提供一些模拟Soap服务。 我想回传一个传入的更新调用。
我的请求如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soap:Body>
<ns2:setEvents xmlns:ns2="http://example.com/eventingservices" xmlns:ns3="http://example.com/eventing/sdo">
<setEventsRequest>
<SystemCode>ABC</SystemCode>
<Event>
<EventTypeCode>01</EventTypeCode>
</Event>
<Event>
<EventTypeCode>04</EventTypeCode>
</Event>
</setEventsRequest>
</ns2:SetEvents>
</soap:Body>
</soap:Envelope>
然后我想简单地将事件列表转移到响应中。它们与请求具有相同的属性。
典型的回答如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soapenv:Body>
<qu:setEventsResponse xmlns:qu="http:/example.com/eventingServices">
<setEventsResponse>
<Event>
<EventTypeCode>01</EventTypeCode>
</Event>
<Event>
<EventTypeCode>04</EventTypeCode>
</Event>
</setEventsResponse>
</qu:setEventsResponse>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用以下Groovy脚本,用$ {events}替换响应中的事件:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(mockRequest.requestContent)
def events = String.valueOf(holder.getNodeValues("//Event"))
context.setProperty("events", events);
我也尝试了上面没有做过的字符串。无济于事。
请帮助我。 如果我能让这个该死的东西上班,我会给你买啤酒!
答案 0 :(得分:0)
我想你在SOAPUI中有一个模拟服务配置如下。
操作的响应类似于:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soapenv:Body>
<setEventsResponse xmlns="http:/example.com/eventingServices">
<setEventsResponse>
${events}
</setEventsResponse>
</setEventsResponse>
</soapenv:Body>
</soapenv:Envelope>
在您的mockService的onRequestScript
标签上,您希望拥有必要的脚本来获取<Event>
中的request
个节点,并使用{response
将其放入${events}
{1}}财产。为此,我建议您使用XmlSlurper
,如下所示:
import groovy.xml.StreamingMarkupBuilder
// parse the request
def reqSlurper = new XmlSlurper().parseText(mockRequest.requestContent)
// find all 'Event' nodes from request
def events = reqSlurper.depthFirst().findAll { it.name() == 'Event' }
// builder to convert the nodes to string
def smb = new StreamingMarkupBuilder()
// concatenate in the string all "<Event>" nodes from request
def eventAsString = ''
events.each{
eventAsString += smb.bindNode(it)
}
// set the property to use in the response
context.setProperty("events", eventAsString);
这一切都是为了让它发挥作用:)
。
另请注意,xmls中存在一些错误。您的问题中的请求格式不正确:</ns2:SetEvents>
未关闭<ns2:setEvents>
(请注意大写),如果您希望xmlns:ns2="http://example.com/eventingservices"
命名空间适用于<SetEvents>
的所有子项,则将ns2
添加到所有子节点或删除ns2以使其成为此子树的默认值:<SetEvents xmlns="http://example.com/eventingservices"
&gt;`(这也适用于您的响应)
希望它有所帮助,