3.1.5. Запросы в формате XML (SOAP)
3. Запросы из внешних систем 3.1. Запросы к данным 3.1.5. Запросы в формате XML (SOAP)
Рассмотрим обработку запросов в формате XML (SOAP) на основе базового примера. Для отправки запросов мы используем простые скрипты на языке Python. Для приёма и обработки запросов нам понадобится кластер TDG, настроенный ранее.
3.1.5.1. Адаптация конфигурации из базового примера
Для повторения примеров из данного раздела нам потребуется внести определенные исправления в конфигурацию системы, загруженную ранее.
Разархивируйте архив с конфигурацией системы в отдельную директорию.
Откройте файл config.yml и измените его так, чтобы он содержал следующий текст:
types:
__file: model.avsc
functions:
router: {__file: router.lua}
classifier: {__file: classificator.
lua}
select_user_books: {__file: select_user_books.lua}
process_user: {__file: process_user.lua}
process_book: {__file: process_book.lua}
process_sub: {__file: process_sub.lua}
pipelines:
router:
- router
classifier:
- classifier
select_user_books:
- select_user_books
process_user:
- process_user
process_book:
- process_book
process_sub:
- process_sub
connector:
input:
- name: soap
type: soap
wsdl: {__file: example.wsdl}
handlers:
- function: Connect
pipeline: router
routing:
- key: input_key
output: to_input_processor
output:
- name: to_input_processor
type: input_processor
input_processor:
classifiers:
- name: classifier
pipeline: classifier
routing:
- key: process_user
pipeline: process_user
- key: process_book
pipeline: process_book
- key: process_sub
pipeline: process_sub
storage:
- key: add_user
type: User
- key: add_book
type: Book
- key: add_subscription
type: Subscription
services:
select_user_books:
doc: "select_user_books"
function: select_user_books
return_type: string
args:
user_id: long
Обратите внимание на появившийся раздел input_processor/routing и связанные
с ним описания новых конвейеров обработки данных (pipeline) и функций.
connector появилось описание входа с
типом SOAP, функцией Connect (не являющейся функцией TDG, но описываемой
в XML/SOAP) и связанным с ней конвейером (уже известным нам по примеру с JSON — router).Примечание
В секции wsdl: обязательно указывается файл спецификации веб-сервиса с
расширением .wsdl. В нашем примере это example.wsdl. Данный файл должен
обязательно быть включен в состав архива с конфигурацией системы. В том случае,
если WSDL не используется, данный файл может быть пустым.
Теперь откройте файл classificator.lua
#!/usr/bin/env tarantool
local param = ...
if (param.obj[1].tag == "username" or param.obj[2].tag == "username") then
param.routing_key = "process_user"
return param
end
if (param.obj[1].tag == "book_name" or param.
obj[2].tag == "book_name") then
param.routing_key = "process_book"
return param
end
if ((param.obj[1].tag == "user_id" and param.obj[2] == "book_id") or (param.obj[2].tag == "user_id" and param.obj[1].tag == "book_id")) then
param.routing_key = "process_sub"
return param
end
param.routing_key = "unknown_type"
return param
Создайте файлы process_user.lua, process_book.lua и process_sub.lua.
Содержимое этих файлов — скрипт обработки данных, который должен формировать из
получаемого TDG информационного объекта объект, соответствующий описанному
в модели данных.
Далее приведен пример содержимого файла process_user.lua.
Остальные файлы выполняются по аналогии.
#!/usr/bin/env tarantool
local param = ...
local id = param.obj[1][1]
local username = param.obj[2][1]
local data = {id = tonumber(id), username = username}
local ret = {obj = data, priority = 1, routing_key = 'add_user'}
return ret
Сформированный вышеуказанным скриптом объект должен содержать поля id и username,
так как он получит routing_key для добавления объекта типа User в хранилище.![]()
Важно
Для сохранения TDG ожидает объект в формате, представленном выше,
где obj включает в себя весь информационный объект в виде перечисленных
через запятую пар key = value, где для каждого обязательного поля объекта
в модели данных задан одноимённый ключ (key) с непустым значением.
Закончив с подготовкой файлов, упакуйте их в zip-архив и загрузите его согласно инструкции.
3.1.5.2. Описание процесса обработки запроса
Логика обработки поступающего запроса изложена в файле конфигурации config.yml и состоит в следующем:
Согласно разделу
connector/inputфайла конфигурацииconfig.yml, SOAP (XML) запросы передаются на обработку конвейеруrouter, который состоит из функцииrouter;Функция
routerссылается на файлrouter.lua, который упаковывает поступивший объект с ключомrouting_keyравным строкеinput_key;Согласно разделу
connector/routingфайла конфигурацииconfig., все объекты с ключом
ymlinput_keyпередаютсяto_input_processor;В секции
outputдля разделаconnectorуказана единственная записьto_input_processor, которая переадресует запрос в разделinput_processorдля обработки на одноименной роли;В разделе
input_processorвсе запросы попадают в секциюclassifiers, где в нашем случае указан один единственный объект, вызывающий конвейер обработки объектов (pipeline)classifier;Конвейер
classifier вызывает одноименную функцию, которая описана в файлеclassificator.lua. Как можно понять из названия, данная функция занимается классификацией поступающей информации. Логика ее работы следующая:при наличии тэга
usernameу поступившего объекта — ему присваиваетсяrouting_key=process_user, то есть объект направляется для формирования объекта типа пользователь;при наличии тэга
book_nameу поступившего объекта — ему присваиваетсяrouting_key=process_book, то есть объект направляется для формирования объекта типа книга;при наличии тэгов
user_idиbook_idу поступившего объекта — ему присваиваетсяrouting_key=process_sub, то есть объект направляется для формирования объекта типа подписка;во всех остальных случаях объекту присваивается
routing_key=unknown_type, то есть объект не распознан.
Такой объект обычно попадает в ремонтную очередь,
но можно настроить и иное поведение;
В разделе
input_processorв секцииrouting имеются указания по обработке объектов со следующимиrouting_key:process_user,process_bookиprocess_subпри помощи одноименных функций. Каждая из этих функций формирует объект в нужном для сохранения формате и присваивает ему соответствующийrouting_key;В секции
storageописано сохранение данных в TDG.при значении
routing_keyравномadd_userобъект сохраняется какUser;при значении
routing_keyравномadd_bookобъект сохраняется какBook;при значении
routing_keyравномadd_subscriptionобъект сохраняется какSubscription.
Обратите внимание, что вся лишняя информация, не относящаяся к типу объекта, описанному в модели данных, не будет сохранена.
Из всего файла конфигурации системы остался не рассмотренным участок, отвечающий
за сервисы. В данном примере там описан простой сервис, вызывающий функцию select_user_books с аргументом user_id и возвращающий строковую переменную.
Логика работы этой функции такова — переданное значение user_id используется
для поиска в объекте всех книг, записанных за данным пользователем.
Затем выводятся все найденные book_id.
3.1.5.3. Подготовка запроса в формате SOAP (XML)
Создайте файл request.py со скриптом на языке Python для отправки простейшего
запроса с полями объекта типа User (из нашей модели данных:
это поля id и username), который будет выглядеть следующим образом:
import requests data = """<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <NS2:Connect xmlns:NS2="http://172.19.0.2:8080/soap"> <id>1</id> <username>John Smith</username> </NS2:Connect> </soap:Body> </soap:Envelope>""" header = {'Authorization' : 'Bearer c0b26a60-aebe-4899-9ab6-4458627ac61e'} r = requests.post(url = "http://172.19.0.2:8080/soap", data = data, headers = header)
Передаваемый запрос содержит заголовок для авторизации и тело в виде
SOAP объекта с обязательными полями для объекта модели данных типа User.
Примечание
Используйте в качестве значения для параметра Authorization: Bearer токен приложений,
сгенерированный ранее.
Для успешного добавления записи имеющегося в модели данных типа объекта в запросе должны содержаться все обязательные поля для данного типа объекта.
Процедура отправки запроса и ожидаемые результаты описаны ранее в пункте Отправка запросов.
Нашли ответ на свой вопрос?
Обратная связь
Радченко Глеб Игоревич
|
Кандидат физико-математических наук, доцент Silicon Austria Labs, Austria, Graz, Staff Scientist Южно-Уральский Государственный Университет, Старный научный сотрудник, доцент кафедры системного программирования |
||
|
E-mail: gleb. |
Научные интересы
- Грид-вычисления.
- Облачные вычисления.
- Распределенные вычислительные системы.
Публикации
- Пособие: Распределенные вычислительные системы [Текст в формате PDF].
- Пособие: Объектно-ориентированное программирование [Электронное издание + URL для загрузки].
- [Полный список публикаций]
Проекты
- Проект Erasmus+ PWs@PhD. Основная цель проекта PWs@PhD – поддержка развития, модернизации, интернационализации высшего образования, а именно исследовательской составляющей европейского образования уровня PhD, содействие созданию новых PhD-программ в странах-партнерах в области программной инженерии.
- Сервисно-ориентированный подход к использованию проблемно-ориентированных пакетов в распределенных и грид-средах (проект DiVTB).
- Параллельная реализация нейросетевого алгоритма распознавания раздельной речи (Часть 1, Часть 2, Часть 3).

Новости
- [2013-12-25] Обновления страниц курсов:
- Курс объектной распределенной обработки: лекция «Облачные платформы: VCloud, Cloudstack, Openstack, Yandex Cocaine», ссылки на материалы по частным облачным платформам.
- [2013-12-17] Обновления страниц курсов:
- Курс объектной распределенной обработки: лекция «Виртуализация, CAP-теорема», доклад Суворова И.Б. «Ботнеты», доклад Беседина К.Ю. «Облачная платформа Windows Azure».
- [2013-11-28] Обновления страниц курсов:
- Курс объектной распределенной обработки: лекция по P2P системам, доклад Кутыревой Е.М. «Облачные вычисления».
- Курс объектной распределенной обработки: в дополнительные материалы добавлена ссылка на проект университета Карлсруе по online-мониторингу активности P2P-сетей (BitTorrent DHT): Live Monitoring of the BitTorrent DHT.

- Курс ООП: доклад И. Сухинского, Е. Неповинных «Паттерны проектирования» (+ примеры реализации паттернов), лекция по алгоритмам стандартной библиотеки С++.
- Курс ООП: в дополнительные материалы добавлена ссылка на подборку материалов по реализации паттернов проектирования посредством языка C++: CPP-REFERENCE.RU
- [2013-11-07] Размещены слайды презентаций:
- Курс объектной распределенной обработки: доклад Радченко В.И. «Концепция REST».
- Курс ООП: презентация по лекци «Стандартная библиотека шаблонов С++».
- [2013-10-26] Размещены слайды презентаций:
- Курс объектной распределенной обработки: презентации по лекциям Сервис-ориентированная архитектура (продолжение), XML веб-сервисы: WSDL, SOAP, XML веб-сервисы: стандарты второго поколения.
- Курс ООП: презентации по лекциям «Наследование (продолжение).
Шаблоны функций», «Шаблоны классов. Исключительные ситуации». - [2013-10-06] В дополнительные материалы курса «Программная инженерия» добавлена ссылка на интерактивный учебный курс по механизмам ветвления в рамках системы управления версиями Git Learn Git Branching.
- [2013-06-03] Размещены слайды презентаций:
- Курс распределенных объектных технологий: доклад Михайлова Прохора Андреевича Windows Communication Foundation: Архитектура WCF, типы контрактов, модели вызовов операций, привязки, WCF vs. ASP.NET Web API .
- Курс Программной инженерии: доклад Радченко Всеволода Игоревича Тестирование исходного кода. Методики тестирования. Разработка через тестирование (Test-driven development).
- Курс Программной инженерии: доклад Кожевиной Елены Игоревны Методология экстремального программирования. Scrum.
[Архив новостей]
Ссылки
- Mendeley — система для каталогизации и управления библиографией.
Встраивается в Microsoft Word, позволяя автоматизировать процесс управления списками литературы при подготовке статей. Поддерживает множество форматов оформления библиографических ссылок, включая ГОСТ-7.0.5-2008. - Memsource — операционная среда для выполнения письменных переводов, включающая базы памяти переводов, встроенный машинный перевод, модуль управления терминологией, а также текстовый редактор MemSource Editor. Может импортировать и экспортировать документы всех стандартных форматов, включая Word и PowerPoint.
Мой профиль
- ResearcherID: G-3547-2013
- Scopus Author ID: 55695192800
- Google Sholar
- ResearchGate
- Academia.edu
javax.xml.soap (платформа Java SE 8)
javax.xml.soap (платформа Java SE 8)В вашем браузере отключен JavaScript.
Пропустить навигационные ссылки
- Обзор
- Пакет
- Класс
- Использовать
- Дерево
- Устарело
- Индекс
- Помощь
Платформа Java™
Standard Ed.
8
- Предыдущий пакет
- Следующий пакет
- Рамки
- Нет кадров
Сводка по интерфейсу Интерфейс Описание Деталь Контейнер для
объектов DetailEntry.DetailEntry Содержимое объекта
Detail, дающее подробные сведения о объектSOAPFault.Имя Представление имени XML.
Узел Представление узла (элемента) в документе XML.
SOAPBody Объект, представляющий содержимое тела SOAP элемент в SOAP-сообщении.

SOAPBodyElement Объект
SOAPBodyElementпредставляет содержимое в объектSOAPBody.Константы SOAP Определение констант, относящихся к протоколу SOAP.
МЫЛЭлемент Объект, представляющий элемент сообщения SOAP, который разрешен, но не специально предписано спецификацией SOAP.
SOAPEnvelope Контейнер для частей SOAPHeader и SOAPBody
Объект SOAPPart.SOAPFault Элемент объекта
SOAPBody, содержащий информация об ошибках и/или статусе.SOAPFaultElement Представление содержимого в объект
SOAPFault.SOAPHeader Представление заголовка SOAP элемент.

Элемент SOAPHeader Объект, представляющий содержимое части заголовка SOAP файла Мыльный конверт.
Текст Представление узла, значение которого является текстом.
Сводка по классу Класс Описание ПриспособлениеДеталь Одно вложение к объекту
SOAPMessage.Фабрика сообщений Фабрика для создания
объектов SOAPMessage.MimeHeader Объект, в котором хранится имя заголовка MIME и его значение.
MimeHeaders Контейнер для
объектов MimeHeader, которые представляют заголовки MIME, присутствующие в MIME-части сообщения.
SAAJMetaFactory Точка доступа для классов реализации фабрик, определенных в API СААЖ.
SAAJРезультат Действует как держатель результатов преобразования JAXP или JAXB. ранжирование в виде дерева SAAJ.
SOAPConnection Соединение точка-точка, которое клиент может использовать для отправки сообщений непосредственно удаленной стороне (представленной, например, URL-адресом).
SOAPConnectionFactory Фабрика для создания
объектов SOAPConnection.SOAPElementFactory Устарело — Используйте
javax.xml.soap.SOAPFactoryдля создания SOAPElements.SOAPFactory SOAPFactory— фабрика по созданию различных объектов существующие в XML-дереве SOAP.
SOAPMessage Корневой класс для всех сообщений SOAP.
МЫЛОЧасть Контейнер для специфичной для SOAP части сообщения
SOAPMessageобъект.Сводка исключений Исключение Описание Исключение SOAP Исключение, указывающее на возникновение исключения SOAP.
Предоставляет API для создания и построения сообщений SOAP. Этот пакет определяется в SOAP с API вложений для Java TM (SAAJ) 1.3 Спецификация .
API в пакете javax.xml.soap позволяет выполнять
следующее:
- создать двухточечное соединение с указанной конечной точкой
- создать сообщение SOAP
- создать фрагмент XML
- добавить содержимое в заголовок сообщения SOAP
- добавить содержимое в тело сообщения SOAP
- создавать части вложения и добавлять к ним содержимое
- доступ/добавление/изменение частей сообщения SOAP
- создать/добавить/изменить информацию об ошибках SOAP
- извлечь содержимое из сообщения SOAP
- отправить сообщение SOAP запрос-ответ
Кроме того, API-интерфейсы в пакете javax. расширяют
их аналоги в пакете org.w3c.dom . Это значит, что
xml.soap SOAPPart из SOAPMessage также является уровнем DOM
2 Документ , и ими можно манипулировать приложениями,
инструменты и библиотеки, использующие DOM (см. http://www.w3.org/DOM/ для получения дополнительной информации).
Важно отметить, что хотя можно использовать DOM API для добавления
обычные узлы DOM в дерево SAAJ, API-интерфейсы SAAJ по-прежнему должны возвращать
Типы SAAJ при изучении или манипулировании деревом. Чтобы выполнить
это API-интерфейсы SAAJ (в частности, SOAPElement.getChildElements() )
разрешено молча заменять объекты, которые неправильно типизированы относительно
требованиям ГААЖ с эквивалентными объектами требуемого типа. Эти
замены никогда не должны приводить к изменению логической структуры дерева,
поэтому с точки зрения DOM API дерево останется неизменным. Однако,
физический состав дерева изменится так, что ссылки
к узлам, которые были заменены, будут относиться к узлам, которые больше не являются
часть дерева.
API-интерфейсам SAAJ не разрешено производить эти замены.
если они не требуются, поэтому замещающие объекты никогда не будут впоследствии
быть автоматически заменены будущими вызовами SAAJ API.
Что это значит в
с практической точки зрения, приложение, которое начинает использовать SAAJ API на
дерево после манипулирования им с помощью API DOM должно предполагать, что дерево было
переведены во все дерево SAAJ и что любые ссылки на объекты внутри
дерево, полученное с помощью DOM API, больше недействительно. Переключение
из API-интерфейсов SAAJ в API-интерфейсы DOM не могут вызывать недопустимые ссылки и
ни один из них не использует исключительно API SAAJ. Это только переход от использования DOM
API в конкретном дереве SAAJ к использованию API SAAJ, что вызывает риск
недействительные ссылки.
- Предыдущий пакет
- Следующий пакет
- Рамки
- Нет кадров
Сообщить об ошибке или функции
Дополнительную справку по API и документацию для разработчиков см.

lua}
select_user_books: {__file: select_user_books.lua}
process_user: {__file: process_user.lua}
process_book: {__file: process_book.lua}
process_sub: {__file: process_sub.lua}
pipelines:
router:
- router
classifier:
- classifier
select_user_books:
- select_user_books
process_user:
- process_user
process_book:
- process_book
process_sub:
- process_sub
connector:
input:
- name: soap
type: soap
wsdl: {__file: example.wsdl}
handlers:
- function: Connect
pipeline: router
routing:
- key: input_key
output: to_input_processor
output:
- name: to_input_processor
type: input_processor
input_processor:
classifiers:
- name: classifier
pipeline: classifier
routing:
- key: process_user
pipeline: process_user
- key: process_book
pipeline: process_book
- key: process_sub
pipeline: process_sub
storage:
- key: add_user
type: User
- key: add_book
type: Book
- key: add_subscription
type: Subscription
services:
select_user_books:
doc: "select_user_books"
function: select_user_books
return_type: string
args:
user_id: long
obj[2].tag == "book_name") then
param.routing_key = "process_book"
return param
end
if ((param.obj[1].tag == "user_id" and param.obj[2] == "book_id") or (param.obj[2].tag == "user_id" and param.obj[1].tag == "book_id")) then
param.routing_key = "process_sub"
return param
end
param.routing_key = "unknown_type"
return param

Такой объект обычно попадает в ремонтную очередь,
но можно настроить и иное поведение;
xmlsoap.org/soap/envelope/">
<soap:Body>
<NS2:Connect xmlns:NS2="http://172.19.0.2:8080/soap">
<id>1</id>
<username>John Smith</username>
</NS2:Connect>
</soap:Body>
</soap:Envelope>"""
header = {'Authorization' : 'Bearer c0b26a60-aebe-4899-9ab6-4458627ac61e'}
r = requests.post(url = "http://172.19.0.2:8080/soap", data = data, headers = header)


Шаблоны функций», «Шаблоны классов. Исключительные ситуации».
Встраивается в Microsoft Word, позволяя автоматизировать процесс управления списками литературы при подготовке статей. Поддерживает множество форматов оформления библиографических ссылок, включая ГОСТ-7.0.5-2008.


