Passing JSESSIONID from a SOAP response to a HTTP request in SOAP UI

后端 未结 1 937
死守一世寂寞
死守一世寂寞 2021-01-16 05:48

I have a test case which performs a login via a SOAP request and the response includes this header:

Set-Cookie  |   JSESSIONID=85fc792a71f8eb1e2f0e9c63339e;         


        
相关标签:
1条回答
  • 2021-01-16 06:38

    Assuming that the test case has two test steps with below names:

    • step1 (of SOAP Request test step)
    • step2 (of HTTP Request test step)

    step1 response contains Set-Cookie in response header. And the step2 needs to send above Cookie as part of request headers.

    The below Script Assertion for step1 does set Cookie to step2. Please follow in-line comments.

    Script Assertion:

    /**
    * This script assertion reads the http response, 
    * collect the cookies for the next http request
    * Provide the next step name where you want to set the Cookie to the request 
    **/
    
    //Change the name of the test step2 below as per your test
    def nextStepName = 'step2'
    
    //Assert if the step1 response has headers
    assert messageExchange.responseHeaders, "Response does not have headers"
    
    //Get the next request using test step name
    def nextRequest = context.testCase.testSteps[nextStepName].httpRequest
    
    //Get the existing headers
    def headers = nextRequest.requestHeaders
    
    //Get Cookie from step1 response and create headers
    if (messageExchange.responseHeaders.containsKey('Set-Cookie')) {
      log.info "Found Cookie in the response headers"
      def cookiez = messageExchange.responseHeaders['Set-Cookie'].value
      def list = []  
      cookiez.each { cookies ->
         list.add(cookies.toString())
      }
      headers['Cookie'] = list
    } else {
      log.warn "Not Found Cookie in the response headers"
    }
    
    //Set the headers for step2
    nextRequest.requestHeaders = headers
    

    Update 1

    Here is improved Script Assertion which allows you to be able to extend very easily:

    • to any number of headers from current step response
    • to any number of test steps as needed
    /**
     * This is the Script Assertion
     * which sets headers to the requested  targeted steps
     * by extracting header from current step response
     **/
    //Assert if response has headers
    assert messageExchange.responseHeaders, "Response does not have any headers"
    
     //Specify all the headers to retrieve from current test step response as keys, target step request headers as values
     //key - current response header name
     //value - target request header name
     //Add more key, values into map if you need to extract and set more headers
    def headerMap = ['Set-Cookie' : 'Cookie']
    //Specify the test  step name for which headers to be set. Change step name as needed.
    //Add call to setHttpHeaders with different test step names as needed to apply for more steps
    setHttpHeaders('step2', headerMap)
    
    
    /**
      * method sets headers to targeted step
      * step is the step name for which headers to be set
      * header map consists key, header name in the current step and value, header name to appear in the 
      * targeted step
      * 
      **/
    def setHttpHeaders(def step, def headerMap) {    
        def nextRequest = context.testCase.testSteps[step]?.httpRequest
        def existingHeaders = nextRequest?.requestHeaders
        headerMap.each {
            existingHeaders[it.value] = getHttpHeaderValue(it.key)
        }
        nextRequest?.requestHeaders = existingHeaders
    }
    
    /**
     * method to retrieve the value of the specified header
     **/
    def getHttpHeaderValue(def headerToLookup) {    
        if (messageExchange.responseHeaders.containsKey(headerToLookup)) {
            log.info "Found ${headerToLookup} in the response headers"
            return messageExchange.responseHeaders[headerToLookup]
        } else {
            log.warn "${headerToLookup} is not found in the response headers"
        }
        null
    }
    
    0 讨论(0)
提交回复
热议问题