SoapUI получает параметры запроса в макетном сервисном скрипте
-
09-09-2019 - |
Вопрос
Это, вероятно, очень простой способ для всех завсегдатаев SoapUI.
Как мне извлечь значение внутри запроса, на который я отвечаю, в сценарии ответа макета сервиса SoapUI?
Допустим, входящий запрос имеет
<ns1:foo>
<ns3:data>
<ns3:CustomerNumber>1234</ns3:CustomerNumber>
</ns3:data>
</ns1:foo>
Как мне перевести "1234" в заводную переменную?Я пробовал с xmlHolder, но, похоже, у меня неправильный XPath.
(Я уже знаю, как задать свойство и интегрировать его значение в ответ.)
Решение
Если вы хотите получить доступ к SOAP-запросу и выполнить некоторую обработку XPath, есть более простой способ сделать это в SoapUI благодаря ГПатх и XmlSlurper.
Вот как вы могли бы получить доступ к номеру клиента:
def req = new XmlSlurper().parseText(mockRequest.requestContent)
log.info "Customer #${req.foo.data.CustomerNumber}"
Начиная с Groovy 1.6.3 (который используется в SoapUI 2.5 и более поздних версиях), XMLSlurper по умолчанию работает в режиме с поддержкой пространства имен и без проверки, поэтому вам больше ничего не нужно делать.
Ваше здоровье!
Шонзилла
Другие советы
Еще один пример:
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
В этом примере мы получаем два параметра из запроса и преобразуем их в double.Таким образом, мы можем выполнить вычисления по параметрам.Пример ответа 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>
Вы можете видеть, как результат вычислений передается обратно в ответ.
В чистой 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 );
}
Расширяющийся 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)