You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:25:17