Set a request body as optional
If the input body parameter is specified with the WSOptional
attribute,
functions that update a resource have the option of not getting a request body.
It is typical to specify an input body parameter when performing an HTTP PUT, POST, or PATCH request to a resource; otherwise error-9106 is raised.
WSOptional
on the ATTRIBUTES()
clause of an input body parameter if a body is not
always required. When set as optional, the fglrestful tool generates two
Genero BDL functions for the same service in the stub file: - the standard function, where you provide the input body parameter.
- a second function, suffixed with "NoRequestBody", where there is no input body
parameter. For
example:
PUBLIC FUNCTION TestRecord NoRequestBody() RETURNING (INTEGER, INTEGER)
If you have multipart input bodies and any one input body is optional, then all input
parameters must set the WSOptional
attribute; otherwise
fglcomp will raise error-9138.
Example: Optional input body
In this sample REST function the user-defined WSContext
variable is used to
check if the request body exists. The WSOptional
attribute is set on the
parameter (rec
) for input sent in the request body.
You must code in the function to have WSContext
detect whether the
client has sent a body at runtime. If the request does not have an input body parameter, the
GWS sets the "NoRequestBody
" entry in the WSContext
variable to true.
The function needs to receive data of the required structure in either a JSON or XML representation.
PRIVATE DEFINE Context DICTIONARY ATTRIBUTES(WSContext) OF STRING
PUBLIC
FUNCTION testRecord(rec RECORD ATTRIBUTES(WSOptional) a INTEGER, b INTEGER END RECORD)
ATTRIBUTES (WSPut,
WSPath = "/record",
WSDescription = "Check for request body with WSContext variable")
RETURNS (INTEGER)
IF Context.contains("NoRequestBody") THEN
DISPLAY Context["NoRequestBody"]
RETURN 0
ELSE
RETURN rec.a + rec.b
END IF
END FUNCTION