Describes the components of the
Interface Mapper for COBOL service interfaces, and explains the purpose of each.
The
Interface Mapper user interface for COBOL Program service interfaces is split into two parts. The left side shows COBOL
entry point fields, and the right shows interface fields, reusable fields, and COBOL assignments.
- COBOL Entry Point pane
- Shows the selected
COBOL Entry Point from the selected COBOL program.
When you drag and drop a field from this pane to any of the other panes (or otherwise create an interface field, COBOL assignment,
or reusable field), an arrow connecting the two fields appears between the panes. You can also drag the
COBOL Entry Point pane to different locations to better view connections.
- Interface Fields - Input pane
- In the
Interface Fields - Input pane, you define the details of each input field you want to include in the current operation of your service interface.
Typically, an interface input field corresponds to a COBOL field shown in the
COBOL Entry Point pane, and an arrow connecting the input field to the entry point field shows between the two panes.
- Interface Fields - Output pane
- In the
Interface Fields - Output pane, you define the details of each output field you want to include in the current operation of your service interface.
Typically, an interface output field corresponds to a COBOL field shown in the
COBOL Entry Point pane, and an arrow connecting the entry point field to the output field shows between the two panes.
- Reusable Fields pane
- This pane is primarily for convenience. In it, you create fields you want to use across operations. Then, for each operation
in which you want to use one of these fields, drag and drop it from the
Reusable Fields pane to
either the
Interface Fields - Input or
Interface Fields - Output pane. The contents of the
Reusable Fields pane does not change from operation to operation in a single service interface.
The
Type of interface field created is derived from the name of the reusable field. For example, if you create a reusable field named
MyReusableField and then drag and drop it into
either the
Interface Fields - Input or
Interface Fields - Output pane pane, the value in the
Type column for that field is
MyResuableField.
- COBOL Assignments pane
- Shows COBOL assignments you create for the service interface. For example, you can use a COBOL assignment to define the path
taken by the application for the current operation by providing a unique parameter value. This enables you to perform a different
function from each operation even if all operations use the same entry point. The program takes a different path depending
on the value of a parameter. Instead of defining an interface field to map to that parameter, place the value here that makes
the program take the required path.
Special considerations for interface fields of JSON (RESTful) service interfaces
- Path and Query fields
-
Interface Fields have three location options: Body, Path, or Query. Body means that the interface field corresponds to the
body of the JSON message. Path and Query are for fields which correspond to the request URI used to invoke the operation.
For Path fields, you specify the corresponding part of the URI by going to Operation > Properties and selecting the Path/HTTP
tab. Query interface fields correspond to the query string at the end of a request URI. A Path or Query interface field must
have a primitive data type, though it may have a nonzero Occurs value (which would be expressed in the actual URI as a comma-separated
array). Note that a Path or Query interface field need not have a mapping if it is intended to only be used for output filtering,
as described below.
At run time, the output response body is filtered by any path- and query-parameter values received in the URI whose parameter
names match the name of an output field in the response body. For example, if an operation is defined with a path of /cars/{make}
and an output body array of "car" items, and the run-time request URI is .../cars/ford?color=red&doors=4 (where "make", "color"
and "doors" are all names of fields defined within "car"), then the response body array would exclude any instances of "car"
whose "make", "color", and "doors" values don't match the URI-specified values. If there are two or more body fields with
the same name, those fields can be differentiated in the query string by specifying one or more parent fields of the desired
field separated with periods (e.g. car.color=red). Partial or incomplete values for filtering can be indicated by using an
asterisk character (*) at the beginning and/or end of the value (e.g. color=red* would match both "red" and "reddish"). Case-sensitive
filtering can be performed by wrapping the value in single quotes (e.g. color='Red'). Note that if you do not want a Path
or Query interface field to act as a filter on the output message, ensure that its name does not match the name of any output
Body interface field. Additionally, there are four special built-in query parameters that can provide further control over
the contents of the response:
- $fields=commaSeparatedListOfOutputFieldNames>
- Indicates that the response body is to contain only the specified fields (and their parent fields and any subordinate fields)
and exclude all other defined fields of the response.
- $limit=maxNumberOfItems
- For array paging, specifies the maximum total number of array elements to return in the response.
- $offset=startIndex
- For array paging, specifies the minimum index of any returned array elements in the response.
- $sort=commaSeparatedListOfOutputFieldNames
- For array sorting, indicates that any returned array elements in the response are to be sorted by the specified field(s),
by default in ascending order. Optionally, placing a plus (+) or minus (-) character before a field name indicates the order
is to be ascending or descending, respectively.
- Anonymous root field
- For service interface operations that send and/or receive a JSON message body, even though the outermost (root) structure,
i.e. a JSON object, array, or primitive, is obligatorily nameless in the message, it still must be represented in the operation's
interface fields as the top-level Body field (so that it can be given a Type and Occurs). This so-called "anonymous root"
interface field will be marked with an asterisk (*) to the right of the Location column and, though it will have a name in
the Interface Mapper, that name will not appear in the JSON message. Since there cannot be more than one input top-level Body
interface field nor more than one output top-level Body interface field in an operation, all interface fields that appear
in the body of a message must be children of the top-level Body field. See picture below showing an example of a message body
with an a nonymous-root group field in the Interface Mapper and its corresponding {}-enclosed JSON object in the JSON message.
- Array fields in JSON
- In SOAP (like COBOL), an array is an item defined with a nonzero occurs attribute, and such an item appears in the message
repeated multiple times. For example, an interface-field group array named "group1", with occurs 2, would be represented in
a SOAP message as follows:
<group1>
<field1>someValue1</field1>
<field2>someValue2</field2>
</ group1>
< group1>
<field1>someValue3</field1>
<field2>someValue4</field2>
</ group1>
JSON is different in that it provides explicit array syntax such that an array item is not a repeated item but rather a
single item that
contains repeated values. So, the same interface-field group array from above would look like the following in a JSON message. Note how "group1" is
not repeated but rather appears only once and contains the individual array-element values, which appear as repeated {}-enclosed
JSON objects.
"group1":
[
{
"field1":"someValue1",
"field2":"someValue2"
},
{
"field1":"someValue3",
"field2":"someValue4"
}
]
For "group1" to be included in each repeated array element value in the JSON message (so that it would look more like the
SOAP message), an extra interface-field group would be needed as a parent of the "group1" field in the Interface Mapper, and
the nonzero occurs put on that extra parent field instead of on "group1". The resulting JSON message would then be as follows:
"extraGroup":
[
{
"group1":
{
"field1":"someValue1",
"field2":"someValue2"
}
},
{
"group1":
{
"field1":"someValue3",
"field2":"someValue4"
}
}
]
For all service interfaces in general, a nonzero occurs property indicates that an interface field is an array. However,
for JSON service interfaces in particular, when an interface field has specifically occurs 1, it will appear in the JSON message
as a single object or primitive, without the JSON array syntax.