REST api
dear all,
I have a question. I would like to write a groovy script to call REST using REST API. The same groovy script I used for SOAP request, it is working already. When I implement it and change the test case name, I got an error message "[{
"errorCode": "xxx_ERROR",
"message": "System.JSONException: Unexpected character (',' (code 44)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [line:7, column:33]\n\n(System Code)\n"
}]"
Please help me. Thank you.
my REST request :
{
"INTEGRATIONID" : "testIntegration",
"INTERFACENAME" : "testInterface",
"messages": [
{
"AccountName": ${Property - batch-account-contact#AccountName},
"Billing_Street": ${Property - batch-account-contact#Billing_Street},
"AccountNo": ${Property - batch-account-contact#AccountNo},
"Billing_City": ${Property - batch-account-contact#Billing_City},
"Billing_Country": ${Property - batch-account-contact#Billing_Country}
}
]
}
my groovy script :
//grasping data from excel
import com.eviware.soapui.support.GroovyUtils;
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.xssf.usermodel.*
import org.apache.poi.ss.util.*
//myTestCase contains the test case
def myTestCase = context.testCase
//open an excel file
def fs = new FileInputStream("/xxx/batch-account.xlsx");
//def a workbook
Workbook wb = WorkbookFactory.create(fs)
//def the worksheet location in the excel file
def ws = wb.getSheet("Sheet1")
//count the rows
def r = ws.getPhysicalNumberOfRows()
log.info "number of rows : " + r
// get the Property TestStep object
propTestStep = myTestCase.getTestStepByName("Property - batch-account")
project = testRunner.getTestCase().getTestSuite().getProject().getWorkspace().getProjectByName("SkyvvaService")
testSuite = project.getTestSuiteByName("testSuite");
testCase = testSuite.getTestCaseByName("TestCase");
//read the cell
for (def i=1; i<r; i++) {
def row = ws.getRow(i)
def c = row.getPhysicalNumberOfCells()
c=c+1
for(def j=0; j<=c;j++) {
log.info "row : " + i
def cell = row.getCell(j)
if (j == 0) {
log.info "column : " + j
AccountNo = cell.getStringCellValue()
propTestStep.setPropertyValue("AccountNo", AccountNo)
//the value is saved in the property
log.info AccountNo
}
if (j == 1) {
log.info "column : " + j
AccountName = cell.getStringCellValue()
propTestStep.setPropertyValue("AccountName", AccountName)
//the value is saved in the property
log.info AccountName
}
if (j == 2) {
log.info "column : " + j
Billing_Street = cell.getStringCellValue()
propTestStep.setPropertyValue("Billing_Street", Billing_Street)
//the value is saved in the property
log.info Billing_Street
}
if (j == 3) {
log.info "column : " + j
Billing_City = cell.getStringCellValue()
propTestStep.setPropertyValue("Billing_City", Billing_City)
//the value is saved in the property
log.info Billing_City
}
if (j == 4) {
log.info "column : " + j
Billing_Country = cell.getStringCellValue()
propTestStep.setPropertyValue("Billing_Country", Billing_Country)
//the value is saved in the property
log.info Billing_Country
}
}
log.info "Row #. " + r
// to run the SOAP request
def step = context.testCase.testSteps['REST-integrateBatch']
step.run(testRunner, context)
}
wb.close()
Property expansions are those times you use the ${ } notation inside some string in SoapUI. It's made to look similar to the groovy syntax for Strings (GStrings), but it's not quite the same thing. Property expansions can more easily find some things, like how you are using it to get a property belonging to a on another test step. This functionality was created inside SoapUI.
As for your request, the data inside the messages object looks correct. But you have changed it from your first version which had an array of objects, similar to (1):
"messages": [ { "abc" = "def" } ]
But what you have now is not valid, similar to (2):
"messages": [ "abc": "def "]
Either go back to the first type (an array of objects) or you can just use a single object (3):
"messages": { "abc":"def" }
This will depend on what your API is expecting, either like (1) or like (3).
{ "INTEGRATIONID" : "testIntegration", "INTERFACENAME" : "testInterface", "messages": [{ "AccountName": "${Property - batch-account-contact#AccountName}", "Billing_Street": "${Property - batch-account-contact#Billing_Street}", "AccountNo": "${Property - batch-account-contact#AccountNo}", "Billing_City": "${Property - batch-account-contact#Billing_City}", "Billing_Country": "${Property - batch-account-contact#Billing_Country}" }] }