2009-06-03 44 views
22

Probablemente sea muy fácil para todos los usuarios regulares de SoapUI.SoapUI recibiendo parámetros de solicitud en el script de servicio simulado

En un script de simulacro de respuesta del 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 consigo el "1234" en una variable maravilloso? Intenté con xmlHolder, pero parece que tengo el XPath incorrecto.

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

Respuesta

28

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 el poder de GPath y 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 necesites hacer.

¡Salud!
Shonzilla

+0

un montón de XML-Q/a aquí, pero si usted tiene una solicitud JSON, funciona de manera similar con 'def requestJson = new groovy.json.JsonSlurper(). parseText (mockRequest.requestContent)' y p. ej. 'log.info" $ {requestJson.'CustomerNumber '} "' – fheub

22

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 forma podemos realizar cálculos sobre 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.

+0

¡Gracias por tu ejemplo! ¡Me gustan las respuestas de Shonzilla y de ti! – Thorsten79

0

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

Entonces, 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 ); 
} 
Cuestiones relacionadas