2009-06-03 13 views
22

Dies ist wahrscheinlich ein sehr einfaches für alle SoapUI Stammkunden.SoapUI Anfrage Parameter in Mock-Service-Skript erhalten

Wie extrahiere ich in einem SoapUI-Dienstantwortskript den Wert in der Anfrage, auf die ich antworte?

sagen Lassen Sie die eingehende Anfrage

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

Wie erhalte ich die "1234" in eine Groovy Variable hat? Ich habe es mit einem xmlHolder versucht, aber ich habe den falschen XPath.

(Ich weiß, wie eine Eigenschaft zu setzen und seinen Wert in die Antwort bereits integriert.)

Antwort

28

Wenn Sie SOAP-Anforderung zugreifen möchten und eine XPath-Verarbeitung tun, gibt es einen einfacheren Weg, um es in soapUI dank zu tun die Kraft von GPath und XmlSlurper.

Hier ist, wie Sie die Kundennummer zugreifen würde:

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

Ab Groovy 1.6.3 (die in soapUI 2.5 und darüber hinaus verwendet wird), XmlSlurper läuft im Namespace-aware und nicht-Validierung Modus standardmäßig Es gibt also nichts anderes, was du tun musst.

Prost!
Shonzilla

+0

Viele XML-Q/A hier, aber wenn Sie eine JSON Antrag haben, es funktioniert ähnlich mit 'def requestJson = new groovy.json.JsonSlurper() .parseText (mockRequest.requestContent)' und z.B. 'log.info" $ {requestJson.'CustomerNumber '} "' – fheub

22

Ein weiteres Beispiel:

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 

In diesem Beispiel erhalten wir zwei Parameter aus der Anfrage und wandeln sie in Doppelzimmer. Auf diese Weise können wir Berechnungen zu den Parametern durchführen. Die Probe SoapUI Antwort für dieses Beispiel ist:

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

Sie können sehen, wie die Berechnungen zur Folge zurückgeführt wird auf die Antwort.

+0

Danke für Ihr Beispiel! Ich mag beide Antworten von Shonzilla und dir! – Thorsten79

0

In einem reinen Java (nicht SoapUI verwenden) Sie würde nur einen benutzerdefinierten Namenskontext wie diese erstellen:

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

Dann analysieren sie etwa so:

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

Erweiterung http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html und basiert auf http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html kam ich mit auf den Punkt:

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