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

Реализуем аналогичное поведение, но для запроса, который содержит XML данные.

Определим еще один сервис, аналогичный сервису балансировки с json валидацией, но с валидацией по xsd:

- id: 3
   allowed_queries:
     - method: post
   url: /balancer_with_validation$
   listen:
     - port: 20202
   modifiers:
     set_output_headers:
       - headers:
          -  REGION $clj_region
   chains:
     request_chains:
       - actions:
          - action: XsdValidation
            params:
              validation_schema: {type: file, path: schemas/test_schema.xsd}
            actions:
             - action: XPathExtractToVars
               params:
                 rules:
                   - xpath: //region/text()
                     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

Как видим, здесь происходит замена действия JsonValidation на XsdValidaton, а JsonPathExtractToVars на XPathExtractToVars. Соответственно, для XPathExtractToVars необходимо определить параметр rules, в котором говорим, что будем извлекать данные из текстового элемента внутри тэга region и помещать это значение в переменную clj_region.

Создадим файл test_schema.xsd и поместим туда следующую простейшую xsd схему:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="region" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Скопируем схему в каталог /sowa/profile_storage/custom/chains/schemas и выполним стандартную последовательность: стоп — конфигурирование — запуск профиля.

Отправим корректный запрос, тело которого соответствует схеме:

curl -v http://localhost:20202/balancer_with_validation --data '<?xml version="1.0" encoding="UTF-8"?>
<root>
<region>Samara</region>
</root>'

В ответ получим: d36 Проверим, что некорректный запрос не проходит:

curl -v http://localhost:20202/balancer_with_validation --data '<?xml version="1.0" encoding="UTF-8"?>
<root>
<city>Samara</city>
</root>'

В ответ получаем: d37