Step 5: Process the HTTP response
In the final step you process the HTTP response; check for errors, and process the data.
resp. We defined the variable resp as an object of
the com.HttpResponse class earlier, see Step 2: Import extension packages (com, xml, util). Now it is time to process the
response.LET resp = req.getResponse()com.HttpResponse object's getStatusCode function referenced by
the resp variable. Assign the status code to the "status" field of the
info record ( for details about this record see Step 3: Define the records).LET info.status = resp.getStatusCode()The standard HTTP code of 200
indicates a successful operation, so we check for this before looking at the
data.IF info.status = 200 THEN info record. The Content-type header defines the type
associated with the message body's byte sequence. REST APIs commonly use "application/json"or
"application/xml" to reveal the format of the message body.
LET info.resptype = resp.getHeader("Content-Type")Process for XML
IF info.resptype.getIndexOf("/xml",1) THEN
LET doc = resp.getXmlResponse()
LET node = doc.getDocumentElement()
CALL xml.Serializer.DomToVariable(node, add_out)
LET info.response = node.toString()
ELSE # JSON response processing
[...]
END IFIf
the Content-type indicates XML format, we store the HTTP response as data in the
xml.DomDocument object referenced by the doc variable using the
getXmlResponse function. We then get a reference to the root node of the
doc variable object by instantiating the node variable defined as
an object of the xml.DomNode class using the getDocumentElement
function. Recall the doc and node variables were defined earlier, see
Step 2: Import extension packages (com, xml, util).
To serialize the XML data into the add_out variable, we pass a reference to the
node object variable in a call to the xml.Serializer.DomToVariable
function. To convert the data referenced in the node object variable to string, we
use the xml.DomNode.toString function to store it in the "response" field of the
info record.
Process for JSON
If the Content-type does not indicate XML format, then we process the response for JSON, as we anticipate this as the only other option REST APIs use to format the message body.
info
record with a reference to the resp variable, object of the
com.HttpResponse class, using the getTextResponse function. Then
we pass a reference to the info record in a call to the
util.JSON.parse() function to convert the HTTP response to JSON format into the
add_out
record.IF info.resptype.getIndexOf("/xml",1) THEN
# XML response processing
[...]
ELSE # JSON response processing
LET info.response = resp.getTextResponse()
CALL util.JSON.parse(info.response, add_out)
END IFOutputting to the display
IF add_out.status.code = 0 THEN
DISPLAY add_in.a, "+", add_in.b, "=", add_out.r # Display the response, status and result
ELSE
DISPLAY "[", add_out.status.code, "] ", add_out.r
END IFHandling Errors
info record. Other program errors are
caught in the CATCH block and stored in "result" fields of the info record.
TRY
[...]
IF info.status = 200 THEN
[...]
ELSE
LET info.response = SFMT("[%1] %2",resp.getStatusCode(), resp.getStatusDescription())
END IF
CATCH
# Catch other runtime execution errors from the SQLCA diagnostic record
LET info.result.code = status
LET info.result.desc = sqlca.sqlerrm
END TRYThis completes the tutorial for the calculator demo client application. We have seen the basic steps that a RESTful client application must perform in order to carry out a simple request to a Web service. To review the complete source code, see The RESTful calculator demo source.
Each Web services client application will be different in the type of processing that is done. For more examples of Web service applications, see the code samples provided with the package in demo/WebServices.