web-dev-qa-db-fra.com

SoapUI récupère les paramètres de requête dans le script de service fictif

C’est probablement très facile pour tous les habitués de SoapUI. 

Dans un script de réponse de service fictif SoapUI, comment puis-je extraire la valeur dans la demande à laquelle je réponds?

Disons que la demande 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 je semble avoir le mauvais XPath.

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

24
Thorsten79

Si vous souhaitez accéder à la demande SOAP et effectuer un traitement XPath, il existe un moyen plus simple de le faire dans 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 versions ultérieures), XmlSlurper s'exécute en mode non-validant et prenant en compte les espaces de noms; vous n'avez donc rien d'autre à faire.

À votre santé!
Shonzilla

31
Shonzilla

Un autre 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 demande 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 le suivant:

<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 renvoyé à la réponse.

24
Mateusz Mrozewski

En Java pur (sans utiliser 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, analysez-le 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
djangofan

Étendre http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html et sur http://www.soapui.org/apidocs/com/eviware/soapui/support /xmlholder.html J'ai écrit 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
nkanani