Repository navigation
Expand file tree
/
Copy pathREADME.html
More file actions
203 lines (202 loc) · 13.5 KB
/
Copy pathREADME.html
File metadata and controls
203 lines (202 loc) · 13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta revision="52d74688eceb49bcf1c2fb7368460effac42bfeb">
<meta date="2026-10-21T18:05:07.250Z">
<title>FLAT – FLAT</title>
<link rel="stylesheet" href="assets/highlightjs.css?52d74688eceb49bcf1c2fb7368460effac42bfeb">
<link rel="stylesheet" href="assets/styles.css?52d74688eceb49bcf1c2fb7368460effac42bfeb">
</head>
<body>
<header></header>
<h1 id="flat">FLAT<a class="anchor" href="#flat"> # </a></h1>
<p><em>FLAT</em> - the “Frontend Layer API Toolkit” by <a href="https://www.avenga.com/" class="external" target="_blank">Avenga</a> is designed
for easy decoupling frontend from backend in modern web applications.</p>
<p>FLAT is based on well-known <a href="Licenses.html">Open Source Software</a>.
<a href="CHANGELOG.html">Releases</a> are available as <a href="administration/docker.html">Docker images</a>.</p>
<p>This documentation helps building maintainable JSON-based web APIs on
top of FLAT.</p>
<h2 id="tutorial"><a href="tutorial/README.html">Tutorial</a><a class="anchor" href="#tutorial"> # </a></h2>
<p>Create your first FLAT application hands-on and learn the basics in the <a href="tutorial/README.html">Tutorial</a>.
This is the best place to start.</p>
<h2 id="cookbook"><a href="cookbook/README.html">Cookbook</a><a class="anchor" href="#cookbook"> # </a></h2>
<p>Browse the recipes in <a href="cookbook/README.html">FLAT’s Cookbook</a> to learn
how to accomplish common API development tasks with FLAT. Developers will find plenty of examples here.</p>
<h2 id="reference"><a href="reference/README.html">Reference</a><a class="anchor" href="#reference"> # </a></h2>
<p>Look up detailed usage information about FLAT’s nuts and bolts in the <a href="reference/README.html">Reference</a>.</p>
<h2 id="administration"><a href="administration/README.html">Administration</a><a class="anchor" href="#administration"> # </a></h2>
<p>Learn how to deploy and run FLAT APIs in the <a href="administration/README.html">Administration</a> section.</p>
<h2 id="changelog"><a href="CHANGELOG.html">Changelog</a><a class="anchor" href="#changelog"> # </a></h2>
<p>See information about released features in the <a href="CHANGELOG.html">Changelog</a>.</p>
<nav class="main"><ul><li><a href="README.html">Overview</a></li>
<li><details><summary>Administration</summary><ul><li><a href="administration/docker.html">Docker</a></li>
<li><a href="administration/configuration.html">Configuration</a></li>
<li><a href="administration/logging.html">Logging</a></li>
<li><a href="administration/security.html">Security</a></li>
</ul>
</li>
<li><details><summary>Development</summary><ul><li><details><summary>Reference</summary><ul><li><details><summary><a href="reference/actions/README.html">Actions</a></summary><ul><li><a href="reference/actions/auth.html">auth</a></li>
<li><a href="reference/actions/copy.html">copy</a></li>
<li><a href="reference/actions/debug.html">debug</a></li>
<li><a href="reference/actions/dump.html">dump</a></li>
<li><a href="reference/actions/echo.html">echo</a></li>
<li><a href="reference/actions/error.html">error</a></li>
<li><a href="reference/actions/eval.html">eval</a></li>
<li><a href="reference/actions/log.html">log</a></li>
<li><a href="reference/actions/nameshave.html">nameshave</a></li>
<li><a href="reference/actions/pass-body.html">pass-body</a></li>
<li><a href="reference/actions/proxy-request.html">proxy-request</a></li>
<li><a href="reference/actions/regex.html">regex</a></li>
<li><a href="reference/actions/request.html">request</a></li>
<li><a href="reference/actions/requests.html">requests</a></li>
<li><a href="reference/actions/serve.html">serve</a></li>
<li><a href="reference/actions/set-config.html">set-config</a></li>
<li><a href="reference/actions/set-response-headers.html">set-response-headers</a></li>
<li><a href="reference/actions/set-status.html">set-status</a></li>
<li><a href="reference/actions/sub-flow.html">sub-flow</a></li>
<li><a href="reference/actions/template.html">template</a></li>
<li><a href="reference/actions/xslt.html">xslt</a></li>
</ul>
</li>
<li><a href="reference/configuration.html">Configuration</a></li>
<li><a href="reference/debugging.html">Debugging</a></li>
<li><a href="reference/flow.html">Flow</a></li>
<li><details><summary><a href="reference/functions/README.html">Functions</a></summary><ul><li><a href="reference/functions/apply-codecs.html">apply-codecs()</a></li>
<li><a href="reference/functions/array.html">array()</a></li>
<li><a href="reference/functions/array-reverse.html">array-reverse()</a></li>
<li><a href="reference/functions/base64-decode.html">base64-decode()</a></li>
<li><a href="reference/functions/base64-encode.html">base64-encode()</a></li>
<li><a href="reference/functions/body.html">body()</a></li>
<li><a href="reference/functions/calc-signature.html">calc-signature()</a></li>
<li><a href="reference/functions/capitalize-first.html">capitalize-first()</a></li>
<li><a href="reference/functions/content.html">content()</a></li>
<li><a href="reference/functions/datetime-format.html">datetime-format()</a></li>
<li><a href="reference/functions/datetime-parse.html">datetime-parse()</a></li>
<li><a href="reference/functions/datetime-parse-iso.html">datetime-parse-iso()</a></li>
<li><a href="reference/functions/decrypt-xml.html">decrypt-xml()</a></li>
<li><a href="reference/functions/decrypt.html">decrypt()</a></li>
<li><a href="reference/functions/encrypt.html">encrypt()</a></li>
<li><a href="reference/functions/ends-with.html">ends-with()</a></li>
<li><a href="reference/functions/file-exists.html">file-exists()</a></li>
<li><a href="reference/functions/fit-document.html">fit-document()</a></li>
<li><a href="reference/functions/fit-log.html">fit-log()</a></li>
<li><a href="reference/functions/fit-serialize.html">fit-serialize()</a></li>
<li><a href="reference/functions/get-log.html">get-log()</a></li>
<li><a href="reference/functions/has-class.html">has-class()</a></li>
<li><a href="reference/functions/html-parse.html">html-parse()</a></li>
<li><a href="reference/functions/join.html">join()</a></li>
<li><a href="reference/functions/json-doc.html">json-doc()</a></li>
<li><a href="reference/functions/json-parse.html">json-parse()</a></li>
<li><a href="reference/functions/json-stringify.html">json-stringify()</a></li>
<li><a href="reference/functions/json-to-csv.html">json-to-csv()</a></li>
<li><a href="reference/functions/json-to-xml.html">json-to-xml()</a></li>
<li><a href="reference/functions/jwt-decode.html">jwt-decode()</a></li>
<li><a href="reference/functions/jwt-encode.html">jwt-encode()</a></li>
<li><a href="reference/functions/ldap-lookup.html">ldap-lookup()</a></li>
<li><a href="reference/functions/ldap-query.html">ldap-query()</a></li>
<li><a href="reference/functions/lookup.html">lookup()</a></li>
<li><a href="reference/functions/matches.html">matches()</a></li>
<li><a href="reference/functions/md5.html">md5()</a></li>
<li><a href="reference/functions/replace.html">replace()</a></li>
<li><a href="reference/functions/sort.html">sort()</a></li>
<li><a href="reference/functions/split.html">split()</a></li>
<li><a href="reference/functions/tolower.html">tolower()</a></li>
<li><a href="reference/functions/toupper.html">toupper()</a></li>
<li><a href="reference/functions/trim.html">trim()</a></li>
<li><a href="reference/functions/unixtime.html">unixtime()</a></li>
<li><a href="reference/functions/urldecode.html">urldecode(), url-decode()</a></li>
<li><a href="reference/functions/urlencode.html">urlencode(), url-encode()</a></li>
<li><a href="reference/functions/uuid.html">uuid3() and uuid4()</a></li>
<li><a href="reference/functions/verify-signature.html">verify-signature()</a></li>
<li><a href="reference/functions/verify-xmldsig.html">verify-xmldsig()</a></li>
<li><a href="reference/functions/xml-parse.html">xml-parse()</a></li>
<li><a href="reference/functions/xml-to-json.html">xml-to-json()</a></li>
</ul>
</li>
<li><details><summary><a href="reference/templating/README.html">JSON Templates</a></summary><ul><li><a href="reference/templating/oxn.html">OXN</a></li>
<li><a href="reference/templating/comment.html">Comment {{// <comment>}}</a></li>
<li><a href="reference/templating/placeholder.html">Placeholder {{ <expression> }}</a></li>
<li><a href="reference/templating/dot.html">Dot {{.}}</a></li>
<li><a href="reference/templating/comma.html">Comma {{,}}</a></li>
<li><a href="reference/templating/pair-producer.html">Pair Producer {{: <expression> }}</a></li>
<li><a href="reference/templating/variable.html">Variable Definition {{$<name> := <expression> }}</a></li>
<li><a href="reference/templating/if.html">Conditional {{if <condition>}} … {{elseif <condition> }} … {{else}} … {{end}}</a></li>
<li><a href="reference/templating/loop.html">Loop {{loop <array>}} … {{end}}</a></li>
<li><a href="reference/templating/with.html">Context Switch {{with <expression>}} … {{else}} … {{end}}</a></li>
<li><a href="reference/templating/null-coalescing-operator.html">Null Coalescing Operator ??</a></li>
</ul>
</li>
<li><details><summary><a href="reference/openapi/README.html">OpenAPI Integration</a></summary><ul><li><a href="reference/openapi/routing.html">Routing</a></li>
<li><a href="reference/openapi/validation.html">Validation</a></li>
<li><a href="reference/openapi/security.html">Security Check</a></li>
<li><a href="reference/openapi/mocking.html">Mocking</a></li>
<li><a href="reference/openapi/cors.html">CORS</a></li>
<li><a href="reference/openapi/upstream.html">Upstream APIs</a></li>
<li><a href="reference/openapi/differences.html">Differences</a></li>
</ul>
</li>
<li><a href="reference/testing/README.html">Testing</a></li>
<li><a href="reference/variables.html">Variables</a></li>
</ul>
</li>
</ul>
</li>
<li><details><summary>Cookbook</summary><ul><li><a href="cookbook/x-flat-jwt.html">Protecting Access using JWT Tokens</a></li>
<li><a href="cookbook/checking-jwt-tokens.html">Performing Additional Checks on JWT Access Tokens</a></li>
<li><a href="cookbook/proxy-requests.html">Proxying Requests to Upstream APIs (cookbook/Swagger)</a></li>
<li><a href="cookbook/test-templates.html">Testing Templates</a></li>
<li><a href="cookbook/test-api-request.html">Testing API Requests</a></li>
<li><a href="cookbook/test-backend.html">Testing with Backend Requests</a></li>
<li><a href="cookbook/file-serving.html">File Serving</a></li>
<li><a href="cookbook/error-flow.html">Error Handling</a></li>
<li><a href="cookbook/init-flow.html">Extracting Common Initialization Flow Tasks</a></li>
<li><a href="cookbook/envvars.html">Using Environment Variables</a></li>
<li><a href="cookbook/custom-logging.html">Logging Custom Fields</a></li>
<li><a href="cookbook/forward-request-upstream.html">Forwarding a Request to an Upstream API (cookbook/Flow)</a></li>
<li><a href="cookbook/pass-header-field-upstream.html">How can I pass an arbitrary header field to an upstream system?</a></li>
<li><a href="cookbook/pass-header-field-downstream.html">How can I pass response headers to the client?</a></li>
<li><a href="cookbook/request-timeout.html">How can I increase the request timeout to deal with a slow upstream system?</a></li>
<li><a href="cookbook/upstream-post-requests.html">Sending POST requests</a></li>
<li><a href="cookbook/jwt.html">Signing JWT</a></li>
<li><a href="cookbook/see-client-request.html">How can I inspect the client request?</a></li>
<li><a href="cookbook/swagger-docs.html">Auto Docs with Swagger UI</a></li>
<li><a href="cookbook/builtin-mocking.html">Using the Built-in Mocking</a></li>
</ul>
</li>
<li><details><summary><a href="tutorial/README.html">Tutorial</a></summary><ul><li><a href="tutorial/README.html#tools">Tools</a></li>
<li><a href="tutorial/README.html#getting-started">Getting Started</a></li>
<li><a href="tutorial/README.html#openapi">OpenAPI</a></li>
<li><a href="tutorial/README.html#in-the-flow">In the Flow</a></li>
<li><a href="tutorial/README.html#working-with-files">Working with Files</a></li>
<li><a href="tutorial/README.html#request-validation">Request Validation</a></li>
<li><a href="tutorial/README.html#working-with-templates">Working with Templates</a></li>
<li><a href="tutorial/README.html#upstream-requests">Upstream Requests</a></li>
<li><a href="tutorial/README.html#mock-mock">Mock, mock!</a></li>
<li><a href="tutorial/README.html#response-validation">Response Validation</a></li>
<li><a href="tutorial/README.html#request-configuration">Request Configuration</a></li>
<li><a href="tutorial/README.html#upstream-validation">Upstream Validation</a></li>
<li><a href="tutorial/README.html#improving-the-configuration">Improving the Configuration</a></li>
<li><a href="tutorial/README.html#when-things-go-south">When Things Go South</a></li>
<li><a href="tutorial/README.html#configuration-files">Configuration Files</a></li>
</ul>
</li>
<li><a href="CHANGELOG.html">Changelog</a></li>
</ul>
</nav>
<nav class="toc">
<input id="search" type="search" autocomplete placeholder="🔎">
<ul id="search-results"></ul>
<ul><li><a href="#tutorial">Tutorial</a></li><li><a href="#cookbook">Cookbook</a></li><li><a href="#reference">Reference</a></li><li><a href="#administration">Administration</a></li><li><a href="#changelog">Changelog</a></li></ul>
</nav>
<footer></footer>
<script src="assets/minisearch.js"></script>
<script src="assets/search-index.js"></script>
<script src="assets/script.js"></script>
<script>
const baseURI = "";
selectNavElement("README.html")
</script>
</body>
</html>