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.

    yml, все объекты с ключом input_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 используется для поиска в объекте

Subscription всех книг, записанных за данным пользователем. Затем выводятся все найденные 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. [email protected]

Научные интересы

  • Грид-вычисления.
  • Облачные вычисления.
  • Распределенные вычислительные системы.

Публикации

  • Пособие: Распределенные вычислительные системы [Текст в формате PDF].
  • Пособие: Объектно-ориентированное программирование [Электронное издание + URL для загрузки].
  • [Полный список публикаций]

Проекты

  1. Проект Erasmus+ PWs@PhD. Основная цель проекта PWs@PhD – поддержка развития, модернизации, интернационализации высшего образования, а именно исследовательской составляющей европейского образования уровня PhD, содействие созданию новых PhD-программ в странах-партнерах в области программной инженерии.
  2. Сервисно-ориентированный подход к использованию проблемно-ориентированных пакетов в распределенных и грид-средах (проект DiVTB).
  3. Параллельная реализация нейросетевого алгоритма распознавания раздельной речи (Часть 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. xml.soap расширяют их аналоги в пакете org.w3c.dom . Это значит, что 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 и документацию для разработчиков см.

Автор записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *