Цей контент є частиною серії: Рада
Слідкуйте за виходом нових статей цієї серії.
Можливість відправки та отримання повідомлення в стандартному форматі, що розпізнається усіма взаємодіючими системами, лежить в основі технології Web-сервісів. Як правило, цим форматом є SOAP. Повідомлення SOAP можна створювати і відправляти вручну, але багато з необхідних кроків, наприклад установка з'єднання або відправка повідомлення, можуть бути виконані автоматично за допомогою SAAJ (SOAP with Attachments API for Java) - API, що з'явився в результаті роботи над програмним інтерфейсом для передачі повідомлень XML (Java API for XML Messaging - JAXM). У даній статті розглядається послідовність дій зі створення і відправку синхронних повідомлень SOAP.
Весь процес складається з п'яти кроків:
- створення з'єднання SOAP;
- створення повідомлення SOAP;
- формування повідомлення;
- відправка повідомлення;
- отримання відповіді.
SAAJ поставляється в складі пакета для розробки Web-сервісів Java (Java Web Services Developer Pack 1.2, див. Ресурси). У пакет включені також Web-сервер Tomcat, завдяки якому ви можете розгорнути власний Web-сервіс, і демонстраційні програми.
Встановлювати чи налаштовувати Java Web Services Developer Pack 1.2 не представляє труднощів, якщо ви збираєтеся відправляти повідомлення через Web-сервер Tomcat. Якщо ж подібно до того, як це робиться в даній статті, ви хочете відправляти повідомлення через окремий додаток, то будуть потрібні деякі додаткові дії.
Тепер ви можете посилати повідомлення з будь-якої точки в вашій системі, використовуючи власний додаток.
Структура повідомлення SOAP
Почнемо з розгляду структури самих повідомлень. У загальному випадку SOAP-повідомлення складається з оболонки, розділеної на дві основні частини: заголовок і саме повідомлення. Незважаючи на те, що використання цих частин залишається на розсуд конкретного додатка, повідомлення повинні мати певну XML-структуру, подібну показаної в лістингу 1.
Лістинг 1. Приклад повідомлення SOAP
У цьому прикладі заголовок є порожнім, і вся корисна частина укладена в тексті листа. Дане повідомлення використовується для запиту ціни на книгу.
Установка з'єднання і створення повідомлення
Першим кроком є створення екземпляра класу з'єднання і установка самого з'єднання (лістинг 2).
Лістинг 2. Створення з'єднання
Додаток може відправляти повідомлення SOAP безпосередньо через клас SOAPConnection. який тепер включений в пакет SAAJ, або з використанням провайдера повідомлень, що є частиною пакета JAXM. Об'єкт SOAPConnection створюється за допомогою фабрики.
Фабрика також використовується для створення самого повідомлення (лістинг 3).
Лістинг 3. Створення повідомлення
Відмінності між версіями
Якщо ви використовуєте іншу версію SAAJ, наприклад бібліотеку, що входить до складу Axis 1.2, то, можливо, вам слід викликати метод addBodyElement замість addChildElement.
Спочатку за допомогою об'єкта MessageFactory створюється власне повідомлення. У цей момент воно вже включає в себе розділи envelope і header. але вони поки порожні. Об'єкт SOAPPart містить envelope. в який, в свою чергу, включено тіло повідомлення. Далі оголошуються змінні, що містять всі необхідні посилання, зокрема, SOAPBody.
Далі необхідно заповнити даними тіло повідомлення (об'єкт SOAPBody), як показано в лістингу 4.
Лістинг 4. Формування тіла повідомлення
Тіло повідомлення SOAP є звичайним XML-елемент, в який можна поміщати вкладені елементи, такі як getPrice. Далі можна додати елемент isbn і відповідний йому текст. Все робиться так само, як і в разі будь-якого елементу DOM.
SAAJ також дозволяє безпосередньо створити об'єкт SOAPPart -повідомлення з зовнішнього файлу. Наприклад, якщо XML-вміст повідомлення, наведеного в лістингу 1, міститься у файлі prepped.msg. то до нього можна звернутися замість ручного створення повідомлення (лістинг 5).
Лістинг 5. Створення повідомлення із зовнішнього файлу
Клас StreamSource зазвичай використовується при перетвореннях XSL, але в даному випадку з його допомогою просто відкривається файловий потік введення FileInputStream. В результаті у нас вийшло готове до відправки повідомлення.
Відправка повідомлення
При роботі з синхронними повідомленнями SOAP, відправка і отримання відповіді виконуються за один крок (лістинг 6).
Лістинг 6. Відправка повідомлення
Тема SOAPAction
Деякі Web-сервіси можуть повернути помилку, зажадавши наявності в повідомленні заголовка SOAPAction, який використовується для ідентифікації сервісу. Це можна зробити, поставивши необхідне значення в об'єкті MIMEHeaders наступним чином:
MimeHeaders headers =
message.getMimeHeaders ();
headers.addHeader ( "SOAPAction",
"Urn: requiredSOAPAction");
Метод call () блокує виконання програми до моменту отримання відповіді у вигляді об'єкта SOAPMessage.
Лістинг 7. Читання отриманої відповіді
Спочатку, як і завжди при використанні XSLT, необхідно створити об'єкт Transformer. В даному випадку нам просто треба вивести вміст повідомлення, тому таблиця стилів не використовується. Під вмістом розуміється SOAP-частина повідомлення, а не всі повідомлення, в якому можуть ще міститися вкладення. Перед обробкою можна також розділити оболонку і тіло повідомлення. Вміст виводиться в System.out (див. Малюнок 1), але в принципі результат трансформування може виводитися в будь-який доступний потік виведення. Саме перетворення відбувається звичайним чином.
Малюнок 1. Запит і відповідь в SOAP
наступні кроки
У нашому простому прикладі повідомлення просто виводиться в стандартний потік виведення, але з таким же успіхом можна було отримати потрібну інформацію з документа XML. Крім того, хоча в даній статті демонструється синхронна відправка і отримання повідомлень, інтерфейс JAXM, який можна завантажити окремо, дозволяє використовувати провайдер повідомлень, що забезпечує асинхронну доставку за допомогою об'єкта ProviderConnection замість SOAPConnection. Провайдер зберігає повідомлення, поки воно не буде успішно доставлено.
JAXM також підтримує роботу з профілями, які полегшують створення спеціалізованих повідомлень SOAP, таких як SOAP-RP або ebXML.