web-dev-qa-db-ja.com

SoapUIがモックサービススクリプトでリクエストパラメータを取得

これはおそらくすべてのSoapUI常連にとって非常に簡単なものです。

SoapUIモックサービス応答スクリプトで、応答しているリクエスト内の値を抽出するにはどうすればよいですか?

着信要求が持っているとしましょう

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

「1234」をGroovy変数に入れる方法を教えてください。 xmlHolderで試しましたが、XPathが間違っているようです。

(私はすでにプロパティを設定し、その値を応答に統合する方法を知っています。)

24
Thorsten79

SOAPリクエストにアクセスしてXPath処理を実行する場合は、 GPath および XmlSlurperの機能により、soapUIで簡単に実行できます。

お客様番号にアクセスする方法は次のとおりです。

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

Groovy 1.6.3(soapUI 2.5以降で使用)以降、XmlSlurperはデフォルトで名前空間を認識し、検証しないモードで実行されるため、他に必要なことはありません。

乾杯!
ションジラ

32
Shonzilla

もう1つの例:

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

この例では、リクエストから2つのパラメーターを取得し、それらをdoubleに変換します。このようにして、パラメーターの計算を実行できます。この例のサンプルSoapUI応答は次のとおりです。

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

計算結果が応答にどのように渡されるかを確認できます。

24

純粋なJava(SoapUIを使用しない))では、次のようなカスタムのネーミングコンテキストを作成します。

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

次に、次のように解析します。

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

拡張 http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html および http://www.soapui.org/apidocs/com/に基づくeviware/soapui/support/xmlholder.html 私はこれを思いつきました:

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