Подтвердить что ты не робот

SoapUI получает параметры запроса в mock-сервисе script

Это, наверное, очень просто для всех постоянных пользователей SoapUI.

В ответе на mock-службу SoapUI script, как мне извлечь значение внутри запроса, на который я отвечаю?

Предположим, что входящий запрос имеет

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

Как мне получить "1234" в переменную Groovy? Я попытался с xmlHolder, но у меня, похоже, неправильный XPath.

(Я знаю, как установить свойство и интегрировать его значение в ответ уже.)

4b9b3361

Ответ 1

Если вы хотите получить доступ к SOAP-запросу и выполнить некоторую обработку XPath, там будет проще сделать это в soapUI благодаря мощности GPath и XmlSlurper.

Здесь вы можете получить доступ к номеру клиента:

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

Как и в случае с Groovy 1.6.3 (который используется в soapUI 2.5 и выше), XmlSlurper работает по умолчанию и не проверяет статус по умолчанию, поэтому вам больше нечего делать.

Ура!
Shonzilla

Ответ 2

Еще один пример:

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>

Вы можете увидеть, как результат вычислений передается обратно в ответ.

Ответ 3

В чистой 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  ); 
}