25

对于所有 SoapUI 常客来说,这可能是一件非常容易的事情。

在 SoapUI 模拟服务响应脚本中,如何提取我正在回复的请求中的值?

假设传入的请求有

<ns1:foo>
  <ns3:data>
    <ns3:CustomerNumber>1234</ns3:CustomerNumber>
  </ns3:data>
</ns1:foo>

如何将“1234”放入 Groovy 变量?我尝试使用 xmlHolder,但我似乎有错误的 XPath。

(我已经知道如何设置属性并将其值集成到响应中。)

4

4 回答 4

32

如果您想访问 SOAP 请求并进行一些 XPath 处理,由于GPathXmlSlurper的强大功能,soapUI 中有一种更简单的方法可以做到这一点。

以下是访问客户编号的方法:

def req = new XmlSlurper().parseText(mockRequest.requestContent)
log.info "Customer #${req.foo.data.CustomerNumber}"

从 Groovy 1.6.3(在soapUI 2.5 及更高版本中使用)开始,XmlSlurper 默认在命名空间感知和非验证模式下运行,因此您无需执行任何其他操作。

干杯!
松兹拉

于 2009-06-16T10:14:03.477 回答
24

再举一个例子:

def request = new XmlSlurper().parseText(mockRequest.requestContent)
def a = request.Body.Add.x.toDouble()
def b = request.Body.Add.y.toDouble()
context.result = a + b

在此示例中,我们从请求中获取两个参数并将它们转换为双精度值。这样我们就可以对参数进行计算。此示例的示例 SoapUI 响应是:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://example.org/math/types/">
   <soapenv:Header/>
   <soapenv:Body>
      <typ:AddResponse>
         <result>${result}</result>
      </typ:AddResponse>
   </soapenv:Body>
</soapenv:Envelope>

您可以看到计算结果是如何传递回响应的。

于 2009-07-17T07:29:18.370 回答
0

在纯 Java(不使用 SoapUI)中,您只需创建一个自定义命名上下文,如下所示:

import java.util.Iterator;
import java.util.List;

import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;

class WSNamespaceContext implements NamespaceContext
{
    public String getNamespaceURI(String prefix)
    {
        if ( prefix.equals("ns3") )
            return "http://www.mysite.com/services/taxservice";
       else if (prefix.equals("soapenv"))
            return "http://schemas.xmlsoap.org/soap/envelope/";
        else
            return XMLConstants.NULL_NS_URI;
    }

    public String getPrefix(String namespace)
    {
        if ( namespace.equals("http://www.mysite.com/services/taxservice") )
            return "ns3";
        else if (namespace.equals("http://schemas.xmlsoap.org/soap/envelope/"))
            return "soapenv";
        else
            return null;
    }

    public Iterator<List<String>> getPrefixes(String namespace)
    {
        return null;
    }
}

然后,像这样解析它:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xp = factory.newXPath(); 
xp.setNamespaceContext( nsc ); 
XPathExpression xpexpr = xp.compile("//ns3:CustomerNumber/text()");
NodeList nodes = (NodeList)xpexpr.evaluate(doc, XPathConstants.NODESET); 
for ( int i = 0; i < nodes.getLength(); i++ )  { 
    String val = nodes.item(i).getNodeValue();
    System.out.println( "Value: " + val  ); 
}
于 2012-11-14T19:43:03.473 回答
0

扩展http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html并基于http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html我来了有了这个:

// Create XmlHolder for request content
def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )
holder.namespaces["ns3"] = "ns3"

// Get arguments
def custNo = holder.getNodeValue("//ns3:CustomerNumber")
context.setProperty("custNo", custNo)
于 2016-01-13T12:16:32.463 回答