strangenewstar
strangenewstar

Reputation: 175

Updating a WsdlRequest value via SoapUI Pro

I want to update a WsdlRequest parameter values at runtime using groovy. Say I have a WsdlRequest that contains two parameters: name, address. I’d like to pass to this WsdlRequest the values I would like the request to have prior to creating a WsdlSubmit instance. I know the base code is this:

WsdlProject project = new WsdlProject()
WsdlInterface iface = WsdlInterfaceFactory.importWsdl(project, wsdl, true)[0]
WsdlOperation operation = (WsdlOperation) iface.getOperationAt(3)
WsdlRequest request = operation.addNewRequest(requestName)
request.setRequestContent (requestContent);

The requestContent is the soapxml in a String format. Is there a good way to insert my values (say I want name value to be ‘Test’ and address value to be ‘Example’ for the request)? I’d rather not store the xml as a string and update this if I already have that information when I generate the request.

Here is an example of the xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com">
   <soapenv:Header/>
   <soapenv:Body>
      <data:updateFieldName>
         <fieldId>?</fieldId>
         <!--Optional:-->
         <newFieldId>?</newFieldId>
      </data:updateFieldName>
   </soapenv:Body>
</soapenv:Envelope>

Prior to creating the WsdlRequest, I have created a groovy object that contains the values I want to fill into the above soap xml message. Let's say this object states the fieldId = 10 and the newFieldRequest = 15. I a not sure how to pass those values into the request. Is there a way to do this with the SoapUI API? I do have a pro license also.

Upvotes: 0

Views: 1255

Answers (2)

Raghav Pal
Raghav Pal

Reputation: 129

Below is the groovy script for the following:

  1. Update all WSDL Definitions in the project.
  2. Recreate all requests to updated ones.
  3. Takes backup of old requests.

 import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateRequests
    import static com.eviware.soapui.impl.wsdl.actions.iface.UpdateInterfaceAction.recreateTestRequests

    project = testRunner.testCase.testSuite.project; //get the project reference
    def ifaceList = project.getInterfaceList(); //get all the interfaces present in the project in a list

    //start a loop for number of interfaces
    for(int i = 0; i < project.getInterfaceCount() ; i++)
    {

    def iface = project.getInterfaceAt(i);
    def url = iface.definition;
    iface.updateDefinition( url, true); //updateDefinition(String url , Boolean createRequests)

    //The above part updates the definition
    //The part below recreates the requests based on updated wsdl definition

    //syntax - 
    //recreateRequests( WsdlInterface iface, boolean buildOptional, boolean createBackups, boolean keepExisting, boolean keepHeaders )

    recreateRequests(iface,true,true,true,true);
    recreateTestRequests(iface,true,true,true,true);
    }
    //End of Script//

Upvotes: 0

albciff
albciff

Reputation: 18507

You can use an XMLHolder to parse your xml, and the you can use setNodeValue(xpath, value) to specify the value for this node, in your case this looks like:

import com.eviware.soapui.support.XmlHolder

// your request content
def requestContent = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com">'+
   '<soapenv:Header/>'+
   '<soapenv:Body>'+
      '<data:updateFieldName>'+
         '<fieldId>?</fieldId>'+
         '<newFieldId>?</newFieldId>'+
      '</data:updateFieldName>'+
   '</soapenv:Body>'+
'</soapenv:Envelope>'

// parse it as xml bean
def requestXml = new XmlHolder(requestContent)
// set your node values
requestXml.setNodeValue("//*:fieldId","10");
requestXml.setNodeValue("//*:newFieldId","15");

Then to get the xml content as string again you can use getXml() method as follows:

WsdlRequest request = ...
// to set in your request use getXml()
request.setRequestContent (requestXml.getXml());

For more info you can take a look at XMLHolder api documentation

There is also another way to do this without groovy script; using properties. You can add a properties in for example your TestCase and then use it directly in your TestStep request like this:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data="http://test.com">
   <soapenv:Header/>
   <soapenv:Body>
      <data:updateFieldName>
         <fieldId>${#TestCase#yourProperty}</fieldId>
         <newFieldId>${#TestCase#anotherProperty}</newFieldId>
      </data:updateFieldName>
   </soapenv:Body>
</soapenv:Envelope>

If you're interested in this take a look at: Working with properties and property expansion

EDIT BASED ON COMMENT:

I write a whole example with your code and xml holder using a public wsdl due you can try and get the result without the NPE and compare with yours to check what is going on:

import com.eviware.soapui.impl.wsdl.WsdlProject
import com.eviware.soapui.impl.wsdl.WsdlInterface
import com.eviware.soapui.impl.WsdlInterfaceFactory
import com.eviware.soapui.impl.wsdl.WsdlOperation
import com.eviware.soapui.impl.wsdl.WsdlRequest
import com.eviware.soapui.support.XmlHolder

wsdl = "http://www.webservicex.net/geoipservice.asmx?WSDL"
WsdlProject project = new WsdlProject() 
WsdlInterface iface = WsdlInterfaceFactory.importWsdl(project, wsdl, true )[0] 
WsdlOperation operation = (WsdlOperation) iface.getOperationByName( "GetGeoIP" ) 
WsdlRequest request = operation.addNewRequest("Request") 
def defaultRequest = operation.createRequest(true) 
def xmlHolder = new XmlHolder(defaultRequest)
xmlHolder.setNodeValue("//*:IPAddress","127.0.0.1");
request.setRequestContent (xmlHolder.getXml());

Hope this helps,

Upvotes: 2

Related Questions