150 lines
4.1 KiB
Plaintext
150 lines
4.1 KiB
Plaintext
|
@c This document is part of the Liza Data Collection Framework manual.
|
||
|
@c Copyright (C) 2017 R-T Specialty, LLC.
|
||
|
@c
|
||
|
@c Permission is granted to copy, distribute and/or modify this document
|
||
|
@c under the terms of the GNU Free Documentation License, Version 1.3
|
||
|
@c or any later version published by the Free Software Foundation;
|
||
|
@c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||
|
@c Texts. A copy of the license is included in the section entitled ``GNU
|
||
|
@c Free Documentation License''.
|
||
|
|
||
|
@node Data API
|
||
|
@chapter Data API
|
||
|
@maintenance{This is a complex system with too much logic lying in
|
||
|
@srcrefjs{dapi,DataApiManager} (having been extracted
|
||
|
from its old home in @srcrefjs{program,Program} ).}
|
||
|
|
||
|
@helpwanted{}
|
||
|
|
||
|
The @dfn{Data API} is a declarative abstraction for accessing and
|
||
|
processing remote data (e.g. a RESTful service).
|
||
|
The name stems from how it is used@mdash{
|
||
|
}to declare an remote API's inputs and outputs.
|
||
|
|
||
|
This system is generally used indirectly through the @progxmlref{}.@footnote{
|
||
|
@proguicxref{Data API}.}
|
||
|
|
||
|
@tip{All interaction with this system should be had through the
|
||
|
@srcrefjs{dapi,DataApiManager}.}
|
||
|
|
||
|
The @srcrefjs{dapi,DataApiManager} manages the entire operation@mdash{
|
||
|
}from triggering the initial request,
|
||
|
to performing mapping,
|
||
|
to populating bucket data.
|
||
|
It takes only a @srcrefjs{dapi,DataApiFactory} and @dapi{} definitions.
|
||
|
|
||
|
Definitions have the following schema:@footnote{
|
||
|
There are poor design decisions that will likely persist
|
||
|
indefinitely because of integration with other systems,
|
||
|
so future extensions may be messy (especially in the case of
|
||
|
@samp{retvals}).
|
||
|
}
|
||
|
|
||
|
@verbatim
|
||
|
{
|
||
|
"type": "string",
|
||
|
"source": "string",
|
||
|
"method": "string",
|
||
|
"params": {
|
||
|
["string(name)"]: {
|
||
|
"name": "string(name)",
|
||
|
"default": {
|
||
|
"type": "string",
|
||
|
"value": "string"
|
||
|
},
|
||
|
...
|
||
|
},
|
||
|
},
|
||
|
"retvals": [ "string", ... ],
|
||
|
"static": [
|
||
|
{
|
||
|
["string(param)"]: "string",
|
||
|
...
|
||
|
},
|
||
|
...
|
||
|
],
|
||
|
"static_nonempty": boolean,
|
||
|
"static_multiple": boolean
|
||
|
}
|
||
|
@end verbatim
|
||
|
|
||
|
Each of the above fields are defined by:
|
||
|
|
||
|
@table @code
|
||
|
@item type
|
||
|
Any type supported by @srcrefjs{dapi,DataApiFactory} (e.g. @samp{rest}).
|
||
|
|
||
|
@item source
|
||
|
Type-specific source of data.
|
||
|
For e.g. @samp{rest}, this is a URI.
|
||
|
|
||
|
@item method
|
||
|
Type-specific method for interacting with the API.
|
||
|
For e.g. @samp{rest}, this is an HTTP@tie{}method.
|
||
|
|
||
|
@item params
|
||
|
Key-value mapping of input parameter names (as received by @samp{source})
|
||
|
to their default values.
|
||
|
These inputs must be populated by the caller at the time of the request.
|
||
|
|
||
|
@item retvals
|
||
|
Array of fields returned by the data source.
|
||
|
|
||
|
@item static
|
||
|
Static values to prepend to the returned data.
|
||
|
This is often used for adding ``please select'' text, for example.
|
||
|
|
||
|
@item static_nonempty
|
||
|
Whether statics should be added when there is return data;
|
||
|
Otherwise,
|
||
|
they will be added only if the response yields no results.
|
||
|
|
||
|
@item static_multiple
|
||
|
Whether statics should be added only if multiple data are returned.
|
||
|
For example,
|
||
|
a ``please select'' is only useful if there is more than one
|
||
|
option for the user to select from.
|
||
|
When @samp{true},
|
||
|
this has the convenient side-effect of auto-selecting the only
|
||
|
result.
|
||
|
@end table
|
||
|
|
||
|
An example definition appears in @ref{f:dapi-ex}
|
||
|
|
||
|
@float Figure, f:dapi-ex
|
||
|
@example
|
||
|
@{
|
||
|
"type": "rest",
|
||
|
"source": "/foo/city",
|
||
|
"method": "post",
|
||
|
"params": @{
|
||
|
"getVal": @{
|
||
|
"name": "getVal",
|
||
|
"default": @{
|
||
|
"type": "string",
|
||
|
"value": "getCityOptions"
|
||
|
@}
|
||
|
@},
|
||
|
"zipcode": @{
|
||
|
"name": "zipcode",
|
||
|
"default": @{
|
||
|
"type": "ref",
|
||
|
"value": ""
|
||
|
@}
|
||
|
@}
|
||
|
@},
|
||
|
"retvals": [ "city", "id", "state", "county", "country" ],
|
||
|
"static": [ @{
|
||
|
"city": "(Please Select)",
|
||
|
"id": "",
|
||
|
"state": "",
|
||
|
"county": "",
|
||
|
"country": ""
|
||
|
@} ],
|
||
|
"static_nonempty": false,
|
||
|
"static_multiple": true
|
||
|
@},
|
||
|
@end example
|
||
|
@caption{Example @dapi{} definition}
|
||
|
@end float
|