Forum Discussion

AAB's avatar
AAB
Regular Contributor
6 years ago

ReadyAPI: How to add query parameters to an URL as a Resource

Hi,

 

Setup of my testcase is a groovy script that needs to read a URL and find a particular beId.

When found, that parameter is saved on Project Level in 'Customer Property'.

A second part of the code need to fetch that parameter from the Project Level and add it to the same URL.

What I have so far:

 

//cfr.  https://www.leveluplunch.com/groovy/examples/get-webpage-content-url-uri/
//https://community.smartbear.com/t5/SoapUI-Pro/How-to-Parse-a-JSON-Response-Using-Groovy-Examples/td-p/155770
import groovy.json.JsonSlurper

def getConceptSchemes = "https://pdc.dig.ta.belgium.be/api/pdc/concepts/schemes".toURL().getText()
//parse json string using JsonSlurper - basically converts it to a groovy list
def parsedJson = new groovy.json.JsonSlurper().parseText(getConceptSchemes)
//get data
def findAGC = parsedJson.find { it.name == 'ACTIVITY_GROUP' }
//log.info "result for specific beID: " + findAGC
log.info (findAGC.beId)
log.info (findAGC.language)

//put beid in request parameter
//cfr.  https://www.soapui.org/scripting-properties/tips-tricks.html
testRunner.testCase.testSuite.project.setPropertyValue('param_beid', findAGC.beId )
testRunner.testCase.testSuite.project.setPropertyValue('param_lang', findAGC.language )

//add the beId to the URL and put it in the REST request
//cfr; : https://kousenit.org/2011/11/02/converting-groovy-maps-to-query-strings/
def base = "https://pdc.dig.ta.belgium.be/api/pdc/concepts/schemes"
def params = [beId:findAGC.beId]
def sendToURL = base + params.collect{k,v -> '$k=$v'}.join('&')

What I get as result:

the beId in logfile and a popupwindow that only gives me the [$k=$v] in the URL in a script. (see screenshot)

 

What I want:

beId saved on PropertyLevel (=OK)

beId fetched from PropertyLevel and in URL from RESTRequest but as a Resource, it needs to be as a parameter IN the URL AS a resource. So actually I should have something like this:

https://pdc.dig.ta.belgium.be/api/pdc/concepts/schemes?beId=79ebe16a-da8b-4ce4-a388-c8b2287a2238

 

where beId = $k  and the UUID=$v

 

Does anyone have an idea how to do this please?

 

Thanks in advance.

 

  • richie  OK, I found the solution on my own!  :-) 

     

    Setup a Project in ReadyAPI with 

    * 1 TestSuite

    * 1 TestCase

    * 2 teststeps: 1 Groovy and 1 REST Request

     

    copy this code in the groovy (it seems like a lot but it's not.  I've just added a lot of comments for later or someone else)

     

    //cfr.  https://www.leveluplunch.com/groovy/examples/get-webpage-content-url-uri/
    //https://community.smartbear.com/t5/SoapUI-Pro/How-to-Parse-a-JSON-Response-Using-Groovy-Examples/td-p/155770
    import groovy.json.JsonSlurper
    /*=========================================================================================================*/
    //declare your parameters on Project level. In this case I have declared 2 parameters: beId and language. 
    //don't fill in anything.
    /*==========================================================================================================*/
    def getConceptSchemes = "https://pdc.dig.ta.belgium.be/api/pdc/concepts/schemes".toURL().getText()
    //parse json string using JsonSlurper - basically converts it to a groovy list
    def parsedJson = new groovy.json.JsonSlurper().parseText(getConceptSchemes)
    //get data
    def findAGC = parsedJson.find { it.name == 'ACTIVITY_GROUP' }
    log.info (findAGC.beId)
    log.info (findAGC.language)
    
    //fill in beid-value in PropertyValue  'param_beid'
    //cfr.  https://www.soapui.org/scripting-properties/tips-tricks.html
    testRunner.testCase.testSuite.project.setPropertyValue('param_beid', findAGC.beId )
    testRunner.testCase.testSuite.project.setPropertyValue('param_lang', findAGC.language )
    

    In your 'Rest Request' not necessary to add a parameter. Except if you want it to be added to the parameters of the URL.

    Go to the tab 'Projects', select the webservice that is linked to your Project, go to its Endpoint and add this in the resource of the URL:

    beId=${#Project#param_beid}

    beId = the parameter that should be looked for by the URL

    Project = Soapcall, don't change this!

    param_beid = the parameter that I defined on Project level for my parameter.

     

    If you run the Groovy test step and the request test step you will see the response.

     

    EDIT:

    This is a possibility for if the file doesn't use rootnames or space declarations!

  • richie's avatar
    richie
    Community Hero
    Hey AAB,

    I'm responding cos there have been a lot of views but no response yet. As you know im not a scripter, but i can probably work this out if i reproduce on my machine so i'll have a go...Rao, msiadak or one of the other coders will probably come back with an answer before i do though.

    But question: your level of coding is about equivalent to mine, so why are you trying to use groovy to do the whole thing rather than use the native functionality? I get the enjoyment of getting a script working, but i always thought it was easier to build your scripting skills (if youre not a coder) by extending the functionality with groovy snippets a bit at a time rather than completely replacing the use of the functionality with code ?

    In your description you mention submitting request to retrieve the beId and save at project level as Customer Property....according to your script there isnt a 'Customer Property' defined...is this is 'param_beid' and maybe 'param_lang'....is that correct?

    Looking at the screenshot it looks like youve got a null for this parm....is this correct?

    Cheers,

    Rich
    • AAB's avatar
      AAB
      Regular Contributor

      Hi richie 

      Thanks for your time an good effort! I appreciate this.

      To answer your questions:

      1)  I did started with groovy snippets step by step where as I came up to this result. The functionality can't do that as far as I know. Also you need to bear in mind how many times you need to repeat those actions. As I have 27 different codes suite to setup, that's a lot of repeats.... (I am on a very heavy project, actually to heavy for ReadyAPI, but as I'm not a java coder I want to use ReadyAPI to test the API's and do as much as possible all the rest....)

      2) Apparently for calling the parameters from property level you need to use this line:

      testRunner.testCase.testSuite.project.setPropertyValue('param_beid', findAGC.beId )

      where "param_beid" is the name you gave to the property saved on Project Level and "findAGC.beId" is the value. In my case I' m searching for the value by parsing the json answer for a particular element (in this case, not the whole JSON file) and calling upon the value expected, for me the "beId".

      3) For language I indeed receive an "null" message what is correct in my case.

       

      Hope this helped a bit.

      Cheers!

      AAB

      • AAB's avatar
        AAB
        Regular Contributor

        richie  OK, I found the solution on my own!  :-) 

         

        Setup a Project in ReadyAPI with 

        * 1 TestSuite

        * 1 TestCase

        * 2 teststeps: 1 Groovy and 1 REST Request

         

        copy this code in the groovy (it seems like a lot but it's not.  I've just added a lot of comments for later or someone else)

         

        //cfr.  https://www.leveluplunch.com/groovy/examples/get-webpage-content-url-uri/
        //https://community.smartbear.com/t5/SoapUI-Pro/How-to-Parse-a-JSON-Response-Using-Groovy-Examples/td-p/155770
        import groovy.json.JsonSlurper
        /*=========================================================================================================*/
        //declare your parameters on Project level. In this case I have declared 2 parameters: beId and language. 
        //don't fill in anything.
        /*==========================================================================================================*/
        def getConceptSchemes = "https://pdc.dig.ta.belgium.be/api/pdc/concepts/schemes".toURL().getText()
        //parse json string using JsonSlurper - basically converts it to a groovy list
        def parsedJson = new groovy.json.JsonSlurper().parseText(getConceptSchemes)
        //get data
        def findAGC = parsedJson.find { it.name == 'ACTIVITY_GROUP' }
        log.info (findAGC.beId)
        log.info (findAGC.language)
        
        //fill in beid-value in PropertyValue  'param_beid'
        //cfr.  https://www.soapui.org/scripting-properties/tips-tricks.html
        testRunner.testCase.testSuite.project.setPropertyValue('param_beid', findAGC.beId )
        testRunner.testCase.testSuite.project.setPropertyValue('param_lang', findAGC.language )
        

        In your 'Rest Request' not necessary to add a parameter. Except if you want it to be added to the parameters of the URL.

        Go to the tab 'Projects', select the webservice that is linked to your Project, go to its Endpoint and add this in the resource of the URL:

        beId=${#Project#param_beid}

        beId = the parameter that should be looked for by the URL

        Project = Soapcall, don't change this!

        param_beid = the parameter that I defined on Project level for my parameter.

         

        If you run the Groovy test step and the request test step you will see the response.

         

        EDIT:

        This is a possibility for if the file doesn't use rootnames or space declarations!