Балансировка на основании содержимого запроса JSON с валидацией#

Немного модифицируем условия, добавив необходимость предварительной валидации тела запроса, т.е. сначала проверим на соответствие схеме, и, если запрос соответствует схеме валидации, тогда пропускаем его и балансируем на нужную группу.

Добавим еще один сервис со следующей конфигурацией:

- id: 2
      allowed_queries:
        - method: post
      url: /balancer_with_validation$
      listen:
        - port: 20201
      modifiers:
        set_output_headers:
          - headers:
             -  REGION $clj_region
      chains:
        request_chains:
          - actions:
             - action: JsonValidation
               params:
                 validation_schema: {type: file, path: schemas/test_schema.json}
               actions:
                - action: JsonPathExtractToVars
                  params:
                    expressions:
                      - path: $.region
                        var: clj_region
            message: $clj_request_body
      upstream_bind_variable: $sel_upstream
      upstream_groups:
        - id: 2
          servers:
            - server: 127.0.0.1:30000
          bind_condition: group_2
          rewrite_uri:
            - from: /balancer_with_validation
              to:  /test
        - id: 1
          servers:
            - server: 127.0.0.1:30001
          bind_condition: group_1
          rewrite_uri:
           - from: /balancer_with_validation
             to: /test
          default: True

Здесь, кроме url сервиса, отличия заключаются только в модификации цепочки действий над запросами - в ней мы определяем корневым действием JsonValidation, а в нем, как дочернее, определяем описанное нами ранее действие JsonPathExtractToVars.

Опишем простую схему валидации test_schema.json, в котором для запроса определено единственное возможное свойство - region с типом string, при этом запретим наличие других свойств в объекте:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
      "region": {
        "type": "string"
      }
    },
    "additionalProperties": false,
    "required": [
      "region"
    ]
  }

Создадим каталог /sowa/profile_storage/custom/test_chain/schemas и поместим туда файл test_schema.json. Остановим профиль, переконфигурируем его и запустим. После чего отправим запрос для проверки: d34

Как видим, запрос не прошел, так как он не соответствует схеме валидации. Отправим корректный запрос: d35

В данном случае запрос обработан корректно.