Pregunta

Este es probablemente uno muy fácil para todos los clientes habituales soapUI.

En un simulacro de comando de respuesta del servicio SoapUI, ¿Cómo se extrae el valor dentro de la petición que estoy respondiendo a?

Supongamos que la solicitud entrante tiene

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

¿Cómo consigo el maravilloso en una variable "1234"? Probé con un xmlHolder pero parecen tener el XPath mal.

(sé cómo establecer una propiedad e integrar su valor en la respuesta ya.)

¿Fue útil?

Solución

Si desea acceder a la solicitud SOAP y hacer algo de procesamiento de XPath, hay una manera más fácil de hacerlo en soapUI gracias a la potencia de y href="http://groovy.codehaus.org/api/groovy/util/XmlSlurper.html" rel="noreferrer"> XmlSlurper .

Así es como usted podrá acceder el número de cliente:

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

A partir de Groovy 1.6.3 (que se utiliza en soapUI 2.5 y más allá), XmlSlurper se ejecuta en espacio de nombres-consciente y el modo no validador por defecto, así que no hay nada más que tenga que hacer.

Saludos!
Shonzilla

Otros consejos

Un ejemplo más:

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

En este ejemplo se obtienen dos parámetros de la petición y convertirlos en dobles. De esta manera se puede realizar cálculos de los parámetros. La respuesta SoapUI muestra para este ejemplo es:

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

Se puede ver cómo el resultado se pasa de nuevo a la respuesta de los cálculos.

En una aplicación Java pura (sin utilizar SoapUI) que acaba de crear un contexto de nombres de encargo como éste:

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

A continuación, analizarlo, así:

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 y en base a http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html me ocurrió esto:

// 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top