xml SoapUI 在模拟服务脚本中获取请求参数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/945403/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SoapUI getting request parameters in mock service script
提问by Thorsten79
This is probably a very easy one for all SoapUI regulars.
对于所有 SoapUI 常客来说,这可能是一个非常简单的方法。
In a SoapUI mock service response script, how do I extract the value inside the request I'm replying to?
在 SoapUI 模拟服务响应脚本中,如何提取我正在回复的请求中的值?
Let's say the incoming request has
假设传入的请求有
<ns1:foo>
<ns3:data>
<ns3:CustomerNumber>1234</ns3:CustomerNumber>
</ns3:data>
</ns1:foo>
How do I get the "1234" into a Groovy variable? I tried with an xmlHolder but I seem to have the wrong XPath.
如何将“1234”放入 Groovy 变量中?我尝试使用 xmlHolder,但似乎 XPath 错误。
(I know how to set a property and integrate its value into the response already.)
(我已经知道如何设置属性并将其值集成到响应中。)
回答by Shonzilla
If you want to access SOAP request and do some XPath processing, there's an easier way to do it in soapUI thanks to the power of GPathand XmlSlurper.
如果您想访问 SOAP 请求并进行一些 XPath 处理,由于GPath和XmlSlurper的强大功能,在soapUI 中有一种更简单的方法可以做到这一点。
Here's how you would access the customer number:
以下是访问客户编号的方法:
def req = new XmlSlurper().parseText(mockRequest.requestContent)
log.info "Customer #${req.foo.data.CustomerNumber}"
As of Groovy 1.6.3 (which is used in soapUI 2.5 and beyond), XmlSlurper runs in namespace-aware and non-validating mode by default so there's nothing else you need to do.
从 Groovy 1.6.3(在 soapUI 2.5 及更高版本中使用)开始,XmlSlurper 默认以命名空间感知和非验证模式运行,因此您无需执行其他任何操作。
Cheers!
Shonzilla
干杯!
松齐拉
回答by Mateusz Mrozewski
One more example:
再举一个例子:
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
In this example we get two parameters from the request and convert them to doubles. This way we can perform calculations on the parameters. The sample SoapUI response for this example is:
在这个例子中,我们从请求中获取两个参数并将它们转换为双精度值。这样我们就可以对参数进行计算。此示例的示例 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>
You can see how the calculations result is passed back to the response.
您可以看到计算结果如何传递回响应。
回答by djangofan
In a pure Java (not using SoapUI) you would just create a custom Naming Context like this one:
在纯 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;
}
}
Then, parse it like so:
然后,像这样解析它:
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 );
}
回答by nkanani
Extending http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.htmland based on http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.htmlI came up with this:
扩展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)

