如何在SOAP Mock服务中用Groovy动态生成重复请求节点
实现方案:用Groovy脚本生成多个invoiceData节点
前提假设
假设你使用的是SoapUI(或ReadyAPI)的Mock服务,以下脚本基于XML解析与DOM操作实现动态节点生成,你可以根据实际的XML命名空间和节点层级调整参数。
方案1:Mock服务响应脚本(自动生成多节点响应)
在Mock服务的响应脚本中添加以下代码,可根据收到的单节点请求,生成包含3个重复invoiceData节点的响应:
// 1. 获取原始请求的XML内容 def requestXml = mockRequest.requestContent def xmlSlurper = new XmlSlurper(false, false) def requestNode = xmlSlurper.parseText(requestXml) // 2. 定义命名空间(替换为你实际的命名空间) def ns = new groovy.xml.Namespace("http://example.com/invoices", "inv") // 3. 获取原始的单个invoiceData节点内容 def originalInvoice = requestNode.Body[ns.InvoiceRequest][ns.invoiceData] // 4. 创建新的响应XML结构 def responseBuilder = new groovy.xml.MarkupBuilder() responseBuilder.'soapenv:Envelope'(xmlns:soapenv:'http://schemas.xmlsoap.org/soap/envelope/', xmlns:inv:'http://example.com/invoices') { 'soapenv:Header'() 'soapenv:Body'() { 'inv:InvoiceResponse'() { // 生成3个invoiceData节点,可修改数量 (1..3).each { index -> 'inv:invoiceData'() { 'inv:invoiceId'("INV-00${index}") 'inv:amount'("${index * 100}.00") // 如果需要复用原始节点的其他属性/子节点,可直接复制: // originalInvoice.children().each { child -> delegate."${child.name()}"(child.text()) } } } } } } // 5. 将生成的XML设置为Mock响应内容 mockResponse.setResponseContent(responseBuilder.toString())
关键说明:
- 如果需要复用原始请求中invoiceData的字段值(比如金额、发票ID的前缀),可以替换循环内的硬编码内容,改为从
originalInvoice中提取数据并修改(例如给ID加索引后缀)。 - 命名空间必须与你的SOAP接口完全匹配,否则XML解析会失败。
方案2:请求前置脚本(构造多节点请求发送给Mock服务)
如果是需要在发送请求前动态生成多节点请求,可在SoapUI请求的前置脚本中添加以下代码:
// 1. 获取请求的XML编辑器对象 def request = context.request def xmlHolder = new com.eviware.soapui.support.XmlHolder(request.content) // 2. 定义命名空间(替换为实际值) def ns = "http://example.com/invoices" xmlHolder.declareNamespace("inv", ns) // 3. 获取原始的单个invoiceData节点 def originalInvoiceXml = xmlHolder.getXmlValue("//inv:invoiceData") // 4. 生成2个额外的节点(加上原始的共3个) def additionalInvoices = "" (2..3).each { index -> // 替换节点内的唯一标识(比如invoiceId) def modifiedInvoice = originalInvoiceXml.replaceAll("INV-001", "INV-00${index}") additionalInvoices += modifiedInvoice } // 5. 将额外节点插入到原始节点之后 xmlHolder.setNodeValue("//inv:InvoiceRequest", xmlHolder.getXmlValue("//inv:InvoiceRequest") + additionalInvoices) // 6. 更新请求内容 request.content = xmlHolder.xml
关键说明:
- 脚本通过
XmlHolder操作请求XML,先提取原始节点,修改标识后重复插入,最终构造出多节点请求。 - 如果节点有其他动态字段(比如金额),可扩展
replaceAll逻辑或用XML解析方式修改。
调试技巧
- 在SoapUI的脚本编辑器中,可通过
log.info()输出中间XML内容,排查节点生成是否正确,例如:log.info(xmlHolder.xml)。 - 确保XML结构的闭合标签正确,避免因语法错误导致请求/响应失败。
内容的提问来源于stack exchange,提问作者Konrad Krawczyk
相关产品推荐
相关产品推荐

