xml - tutorial - SoapUI obtiene parámetros de solicitud en el script de servicio simulado
probar servicios rest soapui (4)
Este es probablemente uno muy fácil para todos los clientes habituales de SoapUI.
En una secuencia de comandos de respuesta simulada al servicio SoapUI, ¿cómo extraigo el valor dentro de la solicitud a la que estoy respondiendo?
Digamos que la solicitud entrante tiene
<ns1:foo>
<ns3:data>
<ns3:CustomerNumber>1234</ns3:CustomerNumber>
</ns3:data>
</ns1:foo>
¿Cómo obtengo el "1234" en una variable Groovy? Intenté con xmlHolder, pero parece que tengo el XPath incorrecto.
(Sé cómo establecer una propiedad e integrar su valor en la respuesta ya).
En una Java pura (sin usar SoapUI), simplemente crearía un contexto de nomenclatura personalizado como este:
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;
}
}
Luego, analízalo 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 );
}
Extendiendo http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html y basado en http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html Vine arriba con 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)
Si desea acceder a la solicitud SOAP y realizar un procesamiento XPath, existe una manera más fácil de hacerlo en soapUI gracias a la potencia de GPath y XmlSlurper .
A continuación, le mostramos cómo accedería al 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 posteriores), XmlSlurper se ejecuta en modo consciente y no validador de modo de nombre por lo que no hay nada más que deba hacer.
¡Aclamaciones!
Shonzilla
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, obtenemos dos parámetros de la solicitud y los convertimos en dobles. De esta forma podemos realizar cálculos sobre los parámetros. La respuesta de SoapUI de 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>
Puede ver cómo se devuelve el resultado de los cálculos a la respuesta.