Балансировка на основании содержимого запроса 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 на XsdValidaiton, а 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>'
В ответ получим:
Проверим, что некорректный запрос не проходит:
curl -v http://localhost:20202/balancer_with_validation --data '<?xml version="1.0" encoding="UTF-8"?>
<root>
<city>Samara</city>
</root>'
В ответ получаем:
