FLAT
CouperSevenval TechnologiesDocker ImageGithub
master
master
  • Changelog
  • FLAT
  • Administration
    • Configuration
    • Docker
    • Logging
  • Cookbook
    • Using the Built-in Mocking
    • Performing Additional Checks on JWT Access Tokens
    • Logging Custom Fields
    • Using Environment Variables
    • Handling Errors with an Error Flow
    • File Serving
    • Forwarding a Request to an Upstream API
    • Extracting Common Initialization Flow Tasks
    • Encoding and Decoding JWT
    • Passing Header Fields to the Client
    • How can I pass an arbitrary header field to an upstream system?
    • Performing Additional Checks on JWT Access Tokens
    • Proxying requests to Upstream APIs
    • Increasing the Request Timeout
    • How can I see what the client requested?
    • Using Swagger UI for API Documentation
    • Testing API Requests
    • Testing with Backend Requests
    • Testing Templates
    • Sending POST Requests
    • Processing Upstream Responses
    • Protecting Access using JWT Tokens
  • Reference
    • Configuration
    • Debugging
    • flat CLI
    • Flow
    • Variables
    • OpenAPI / Swagger Integration
    • OpenAPI
      • CORS - Cross-Origin Resource Sharing
    • OpenAPI
      • Differences from Swagger
    • OpenAPI
      • Mocking
    • OpenAPI
      • Routing
    • OpenAPI
      • Security
    • OpenAPI
      • Upstream APIs
    • OpenAPI
      • Validation
    • Flow Actions
      • assert Action
      • auth Action
      • backend-flow Action
      • copy Action
      • debug Action
      • dump Action
      • echo Action
      • error Action
      • eval Action
      • log Action
      • nameshave Action
      • pass-body Action
      • proxy-request Action
      • regex Action
      • request Action
      • requests Action
      • serve Action
      • set-config Action
      • set-env Action
      • set-response-headers Action
      • set-status Action
      • sub-flow Action
      • template Action
      • test-request Action
      • xslt Action
    • Functions
      • apply-codecs()
      • array-reverse()
      • array()
      • base64-decode()
      • base64-encode()
      • body()
      • calc-signature()
      • capitalize-first()
      • content()
      • decrypt-xml()
      • decrypt()
      • encrypt()
      • ends-with()
      • file-exists()
      • fit-document()
      • fit-log()
      • fit-serialize()
      • get-log()
      • has-class()
      • html-parse()
      • join()
      • json-doc()
      • json-parse()
      • json-stringify()
      • json-to-csv()
      • json-to-xml()
      • jwt-decode()
      • jwt-encode()
      • ldap-lookup()
      • ldap-query()
      • lookup()
      • matches()
      • md5()
      • replace()
      • sort()
      • split()
      • tolower()
      • toupper()
      • trim()
      • unixtime()
      • urldecode(), url-decode()
      • urlencode(), url-encode()
      • uuid3() and uuid4()
      • verify-signature()
      • verify-xmldsig()
      • xml-parse()
      • xml-to-json()
    • Templating
      • {{,}}
      • Comment {{// …}}
      • Dot {{.}}
      • Conditional `{{if <condition>}} … {{elseif <condition> }} … {{else}} … {{end}}
      • loop
      • ?? Operator
      • Object XML Notation (OXN)
      • Pair Producer {{: …}}
      • Placeholder
      • Template Variables
      • with
    • Testing
  • Tutorial
Powered by GitBook
On this page
  • Syntax
  • Examples
  • Accessing JSON data received from client's
  • Accessing JSON data loaded from upstream servers
  • Using a template file

Was this helpful?

  1. Reference
  2. Flow Actions

template Action

Previoussub-flow ActionNexttest-request Action

Last updated 5 years ago

Was this helpful?

The <template> action is the primary tool for generating JSON data in FLAT's .

Syntax

  • in: Location of input data

    Either a file (e.g. in="conf.json") or a variable (in="$body"). The input sets the template's initial context ({{.}}). It may be a JSON or .

    in="" signals that no input data is used.

    The context can be changed within the template with .

    Default: fit://request/content

  • out: Location of output data

    Where the generated JSON should be stored.

    This can be a variable. Variables will hold the typed result, such as a JSON object or e.g. a boolean value.

     <template out="$postBody">

    Default: fit://request/content

  • src: Location of the template file

    The template definition can be stored in a separate file. The file path is resolved relatively to the flow file.

     <template src="big.tmpl"/>

    There is no obligatory file extension. However, we recommend tmpl or tpl.

  • check: Check output

    The generated JSON will be parsed and checked. If the template has produced an invalid JSON string, an error will be logged.

    The generated text will still be written to the configured out location. In that case, if out is a variable, the output is not typed.

    Checking can be disabled with check="false".

    Default: true

Examples

Accessing JSON data received from client's

<flow>
  <template in="$body">
  {
    "inputData": {{.}}
  }
  </template>
</flow>

Request with curl:

$ curl -s -H 'content-type: application/json' --data '{"cool":true}' localhost:8080

Output:

{
  "inputData": {
    "cool": true
  }
}

Accessing JSON data loaded from upstream servers

<flow>
  <request>
  {
    "url": "https://httpbin.org/anything",
    "method": "POST",
    "body": {
      "src": "$body"
    }
  }
  </request>

  <template>
  {
    "upstreamResponse": {{.}}
  }
  </template>
</flow>

Request with curl:

$ curl -s -H 'content-type: application/json' --data '{"cool":true}' localhost:8080

Output:

{
  "upstreamResponse": {
    "args": {},
    "data": "{\"cool\":true}",
    "files": {},
    "form": {},
    "headers": {
      "Accept": "*/*",
      "Accept-Encoding": "deflate, gzip",
      "Connection": "close",
      "Content-Length": "13",
      "Content-Type": "application/json",
      "Host": "httpbin.org",
      "User-Agent": "FLAT"
    },
    "json": {
      "cool": true
    },
    "method": "POST",
    "origin": "78.35.14.35",
    "url": "https://httpbin.org/anything"
  }
}

Using a template file

<flow>
  <request>{ "url": "https://httpbin.org/anything" }</request>
  <template src="modifyResponse.tmpl"/>
</flow>

The file path modifyResponse.tmpl is resolved relatively to the flow file.

modifyResponse.tmpl:

{
  "ip": {{ origin }},
  "word": {{ method }}
}

The holds the HTTP body of incoming POST requests.

In this example, we pass the client's POST body to to have it reflected back.

Template Language
XML document
{{with …}}
httpbin.org
pre-defined variable $body