WSName
Specify alternative names for parameters in a REST function.
Syntax
WSName=" description "
- description provides an alternative name for the input parameter or return value it is applied to.
WSName
is an optional attribute.
Usage
Use this attribute to specify names for parameters in a REST function. In general, you do not
need to use WSName
. Consider using it to improve the readability of input
parameters or to format the data returned in the response.
WSName
, the
WSName
value is used in the call to the function. See the examples of
setting this attribute with different parameter types in Table 1.Parameter type | Function parameters with WSName | Description |
---|---|---|
Header | PUBLIC FUNCTION myfunc(p1 INTEGER ATTRIBUTES(WSHeader, WSName =
"myCustomHeader") |
The parameter p1 holds a custom header. The REST function
expects a header named "myCustomHeader", not "p1". |
Query | PUBLIC FUNCTION myfunc(p2 STRING ATTRIBUTES(WSQuery, WSName =
"country") |
On the URL to call the REST function, you must use "country" in the query
string, not "p2", for example /users?country=france
|
Cookie | PUBLIC FUNCTION myfunc(p3 INTEGER ATTRIBUTES(WSCookie, WSName =
"token") |
The parameter p3 holds a cookie. The REST function expects a
cookie named "token", not "p3". |
You use WSName
to format the output data. It allows you to override the
default names ("rv0", "rv1", and so on) that is otherwise output at runtime. By specifying a
more recognizable name for the data, you improve the readability of the output.
Example: WSHeader and WSName in input parameter
In the sample REST function, the Genero Application Server (GAS) environment variable
"X-FourJs-Environment-Variable-REMOTE_ADDR
" that contains the IP address
of the remote client is passed in a header.
As the GAS variable has hyphens ("-"), which are not allowed in Genero BDL variables, the
WSName
attribute is set on the ip_addr
parameter to
identify "X-FourJs-Environment-Variable-REMOTE_ADDR
" in the HTTP request.
ip_addr
parameter is BDL friendly and this is used in the function.
The parameter is also optional as defined by the attribute WSOptional
.
The WSContext attribute, if set, can provide your service with access to environment variables set by the GAS.
PUBLIC FUNCTION getRemoteAddress (ip_addr STRING
ATTRIBUTES(WSHeader,
WSOptional,
WSName = "X-FourJs-Environment-Variable-REMOTE_ADDR") )
ATTRIBUTES (WSGet,
WSPath = "/users/ip",
WSDescription = "Get remote address of the client")
RETURNS (INTEGER ATTRIBUTES(WSHeader), STRING)
DEFINE ip STRING
LET ip = ip_addr
IF ip IS NULL THEN
LET ip = "Got no remote address."
ELSE
LET ip = SFMT("Hello there, you're at %1",ip )
END if
RETURN 3, ip
END FUNCTION
Example 2: Providing a user-friendly parameter name
You would consider setting the WSName
attribute clause of a parameter if the
parameter name is not obvious or user-friendly.
For example, if the parameter references a field name in a database table that is abbreviated,
or could be ambiguous in your function, WSName
provides you with an option to
provide a clearer name.
PUBLIC FUNCTION getUsers(reg STRING ATTRIBUTES(WSQuery, WSOptional, WSName = "region"),
ccode STRING ATTRIBUTES(WSHeader, WSName = "country") )
# ...
END FUNCTION
In the URL that calls the function, the value specified by WSName
must be
used:
http://myhost:6394/gas/ws/r/myGroup/myXcf/MyService/users?region=alsace
Example 3: Formatting output data
In this sample REST function, a set of users is returned. In the returns clause of the function
the WSName
attribute is set on the array returning the user records.
"Users"
will appear as the root path for the output in JSON, or the root
tag for the output in XML.
TYPE profileType RECORD
id INT,
name VARCHAR(100),
email VARCHAR(100)
# ...
END RECORD
PUBLIC FUNCTION getUsers()
ATTRIBUTES (WSGet,
WSPath = "/users",
WSDescription = "Get users resource"
)
RETURNS (DYNAMIC ARRAY ATTRIBUTES(WSName = "Users") OF
profileType ATTRIBUTES(WSMedia = "application/json, application/xml"))
DEFINE regionList DYNAMIC ARRAY OF profileType
DEFINE i INTEGER = 1
DECLARE usersCurs CURSOR FOR SELECT id, name FROM users ORDER BY name
FOREACH usersCurs INTO regionList[i].*
LET i = i+1
END FOREACH
CALL regionList.deleteElement(regionList.getLength())
# Remove the empty element implied by reference in FOREACH loop
RETURN regionList
END FUNCTION