Introduction to Scripting for Payloads
In SAP CPI, not all data transformations can be handled by the standard Message Mapping or XML Converter. For complex logic, dynamic routing, or when dealing with payloads that have complex structures, Groovy and JavaScript are essential. The Groovy language, in particular, offers powerful, built-in libraries for handling both XML and JSON data with ease.
Working with XML using Groovy's 'XmlSlurper'
The 'XmlSlurper' class is a simple and fast way to parse XML payloads. It treats the XML as a tree-like structure, allowing you to easily navigate to and access elements using a simple dot notation.
Example XML Payload:
<Products> <Product id="1001"> <Name>Laptop</Name> <Price>1200.50</Price> </Product> <Product id="1002"> <Name>Mouse</Name> <Price>25.00</Price> </Product> </Products>
Example Groovy Script ('XmlSlurper'):
import com.sap.gateway.ip.core.customdev.util.Message import groovy.xml.* def Message processData(Message message) { def xmlPayload = message.getBody(String.class) // Use XmlSlurper def slurper = new XmlSlurper(false, false) //XmlSlurper(boolean validating, boolean namespaceAware) def products = slurper.parseText(xmlPayload) // Find the price of the product with ID "1001" and set it as a header def laptop = products.Product.find { it.@id == '1001' } if (laptop) { def laptopPrice = laptop.Price.text() message.setHeader('LaptopPrice', laptopPrice) } // Modify the second product's name if (products.Product.size() > 1) { products.Product[1].Name.replaceBody('Wireless Mouse') } // Serialize back to XML string def updatedXml = XmlUtil.serialize(products) message.setBody(updatedXml) return message }
Working with JSON using Groovy's 'JsonSlurper'
The 'JsonSlurper' class provides a similar, intuitive approach for parsing JSON payloads. It converts the JSON string into a native Groovy object (like a Map or a List), which you can then navigate using dot notation or array indexing.
Example JSON Payload:
{ "user": { "id": "u1234", "name": "John Doe", "contact": { "email": "john.doe@example.com", "phone": "555-1234" }, "roles": ["admin", "developer"] } }
Example Groovy Script ('JsonSlurper'):
import com.sap.gateway.ip.core.customdev.util.Message import groovy.json.JsonSlurper def Message processData(Message message) { def jsonPayload = message.getBody(String.class) def jsonSlurper = new JsonSlurper() def parsedJson = jsonSlurper.parseText(jsonPayload) // Access the user's email and set it as a header def userEmail = parsedJson.user.contact.email message.setHeader('UserEmail', userEmail) // Access the second role in the 'roles' array def secondRole = parsedJson.user.roles[1] message.setHeader('SecondRole', secondRole) return message }