Валидация HTTP-форм с использованием JSON-схем#

Для того чтобы преобразовать данные, передаваемые в виде HTTP-формы с помощью JSON схемы используется действие PostFormDataToFlateJson. Действие создает JSON объект, содержащий пары ключ - строковое значение, либо если одному имени параметра соответствует несколько значений, то вида ключ - массив значений.

Предположим, существует форма, содержащая два поля Name и Age, и необходимо проверить, что оба поля приходят, и возраст есть числовое значение, состоящее не менее чем из 3 знаков и не более чем 199.

Создадим схему form.json для проверки содержимого:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
      "name": {
        "type": "string"
      },
      "age":  {
        "type": "string",
        "pattern": "^([1-9]|[1-9][0-9]|[1][0-9][0-9])$"
      }
    },
    "additionalProperties": false,
    "required": [
      "name", "age"
    ]
  }

Скопируем схему в каталог /sowa/profile_storage/custom/chains/schemas.

Теперь опишем конфигурацию сервиса:

- id: 7
      allowed_queries:
        - method: post
      url: /balancer
      listen:
        - port: 20207
      modifiers:
        set_output_headers:
          - headers:
             -  REGION $clj_region
      chains:
        request_chains:
          - actions:
            - action: PostFormDataToFlateJson
              actions:
              - action: JsonValidation
                params:
                  validation_schema: {type: file, path: schemas/form.json}
            message: $clj_request_body
      upstream_group_id: 1
      upstream_groups:
        - id: 1
          servers:
            - server: 127.0.0.1:30001
          rewrite_uri:
           - from: /balancer
             to: /test

Остановим, сконфигурируем и перезапустим профиль.

Проверим работоспособность:

curl -v http://localhost:20207/balancer --data "name=Ivan&age=34"

Запрос проходит успешно: d47

Отправим некорректный запрос:

curl -v http://localhost:20207/balancer --data "name=Ivan&age=500"

d48