SoapUI obtenir des paramètres de requête dans le script de service simulé

c'est probablement très facile pour tous les habitués de SoapUI.

dans un script de réponse de service simulé SoapUI, Comment puis-je extraire la valeur à l'intérieur de la requête à laquelle je réponds?

disons que la requête entrante a

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

Comment obtenir le "1234" dans une variable Groovy? J'ai essayé avec un xmlHolder mais il semble que j'ai le mauvais XPath.

(je sais déjà comment définir une propriété et intégrer sa valeur dans la réponse.)

24
demandé sur Thorsten79 2009-06-03 19:27:32

4 réponses

si vous voulez accéder à SOAP request et faire un traitement XPath, il y a un moyen plus facile de le faire à soapUI grâce à la puissance de GPath et XmlSlurper.

Voici comment accéder au numéro de client:

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

à partir de Groovy 1.6.3 (qui est utilisé dans soapUI 2.5 et au-delà), XmlSlurper fonctionne en mode namespace-aware et non-validating par défaut donc il n'y a rien d'autre que vous devez faire.

Cheers!

Shonzilla!--6-->

31
répondu Shonzilla 2009-06-16 10:14:03

Un exemple:

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

dans cet exemple nous obtenons deux paramètres de la requête et les convertissons en doubles. De cette façon, nous pouvons effectuer des calculs sur les paramètres. L'exemple de réponse SoapUI pour cet exemple est:

<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>

vous pouvez voir comment le résultat des calculs est transmis à la réponse.

24
répondu Mateusz Mrozewski 2009-07-17 07:29:18

dans un Java pur (n'utilisant pas SoapUI), vous créez simplement un contexte de nommage personnalisé comme celui-ci:

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;
    }
}

Ensuite, l'analyser comme suit:

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  ); 
}
0
répondu djangofan 2012-11-14 19:43:03

Extension http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html et basé sur http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html j'ai trouvé ceci:

// 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)
0
répondu nkanani 2016-01-13 12:16:32