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