Підручник з веб-сервісів SOAP: Що таке протокол SOAP?
⚡ Розумний підсумок
SOAP (Simple Object Access Protocol) – це протокол на основі XML для доступу до веб-сервісів через HTTP. У цьому ресурсі пояснюються структурні блоки SOAP, структура повідомлень, елементи конверта та помилки, модель зв'язку та практичний приклад веб-сервісу ASMX.
Що таке SOAP?
SOAP — це протокол на основі XML для доступу до веб-сервісів через HTTP. Він має деякі специфікації, які можна використовувати в усіх програмах.
SOAP відомий як Протокол простого доступу до об'єктів (Simple Object Access Protocol), але пізніше його скоротили до SOAP версії 1.2. SOAP — це протокол, або, іншими словами, визначення того, як веб-сервіси взаємодіють один з одним або з клієнтськими програмами, які їх викликають.
SOAP було розроблено як проміжну мову, щоб додатки, створені на різних мовах програмування, могли легко спілкуватися між собою та уникнути надзвичайних зусиль у розробці.
Вступ до SOAP
У сучасному світі існує величезна кількість програм, побудованих на різних мовах програмування. Наприклад, може бути веб-застосунок, розроблений на Java, ще один у .Net та ще один у PHP.
Обмін даними між програмами є надзвичайно важливим у сучасному мережевому світі. Але обмін даними між цими різнорідними програмами буде складним. Як і складність коду для здійснення цього обміну даними.
Одним із методів боротьби з цією складністю є використання XML (Extensible Markup Language) як проміжної мови для обміну даними між програмами.
Кожна мова програмування може розуміти мову розмітки XML. Таким чином, XML використовувався як базове середовище для обміну даними.
Але немає стандартних специфікацій щодо використання XML у всіх мовах програмування для обміну даними. Саме тут і з'являється програмне забезпечення SOAP.
SOAP був розроблений для роботи з XML через HTTP і має певну специфікацію, яку можна використовувати в усіх програмах. Ми розглянемо додаткові подробиці протоколу SOAP у наступних розділах.
Переваги SOAP
SOAP — це протокол, який використовується для обміну даними між програмами. Нижче наведено деякі з причин використання SOAP.
- Коли розробляєтьсяping Для веб-сервісів на основі SOAP потрібна мова програмування, яку веб-сервіси можуть використовувати для взаємодії з клієнтськими програмами. SOAP – ідеальне середовище, розроблене для досягнення цієї мети. Цей протокол також рекомендований консорціумом W3C, який є керівним органом для всіх веб-стандартів.
- SOAP — це легкий протокол, який використовується для обміну даними між програмами. Зверніть увагу на ключове слово 'світлоОскільки програмування SOAP базується на мові XML, яка сама по собі є легкою мовою обміну даними, SOAP як протокол також належить до тієї ж категорії.
- SOAP розроблений як платформа-незалежний, а також як операційна система. Таким чином, протокол SOAP може працювати з будь-якими програмами на основі мови програмування, як на Windows та Linux платформи.
- Він працює за протоколом HTTP – SOAP працює за протоколом HTTP, який є протоколом за замовчуванням, що використовується всіма веб-застосунками. Отже, немає жодних налаштувань, які потрібні для запуску веб-сервісів, побудованих на протоколі SOAP, для роботи у Всесвітній павутині.
Будівельні блоки SOAP
Специфікація SOAP визначає щось, відоме як "повідомлення SOAP«, який надсилається до веб-сервісу та клієнтської програми.
Наведена нижче схема архітектури SOAP показує різні будівельні блоки повідомлення SOAP.
Повідомлення SOAP — це не що інше, як простий XML-документ, який містить наведені нижче компоненти.
- An Конверт елемент, що ідентифікує XML-документ як SOAP-повідомлення – це частина SOAP-повідомлення, яка використовується для інкапсуляції всіх деталей у SOAP-повідомленні. Це кореневий елемент у SOAP-повідомленні.
- A Header елемент, що містить інформацію заголовка – елемент заголовка може містити таку інформацію, як дані автентифікації, які може використовувати програма, що викликає. Він також може містити визначення складних типів, які можна використовувати в SOAP-повідомленні. За замовчуванням SOAP-повідомлення може містити параметри, які можуть бути простими типами, такими як рядки та числа, але також можуть бути складним об'єктним типом.
Нижче наведено простий приклад SOAP-сервісу складного типу. Припустимо, що ми хочемо надіслати структурований тип даних, який містить комбінацію «Назви посібника» та «Посібника Descriptіон”, тоді ми б визначили комплексний тип, як показано нижче. Комплексний тип визначається тегом елемента Усі необхідні елементи структури разом із відповідними типами даних потім визначаються в колекції складних типів.
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
A Body елемент, що містить інформацію про виклик та відповідь – цей елемент містить фактичні дані, які потрібно надсилати між веб-сервісом та викликаючою програмою. Нижче наведено приклад веб-сервісу SOAP для тіла SOAP, який фактично працює зі складним типом, визначеним у розділі заголовка. Ось відповідь назви посібника та посібника. Descriptіон, який надсилається програмі, яка викликає цю веб-службу.
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
Структура повідомлення SOAP
Слід зазначити, що повідомлення SOAP зазвичай автоматично генеруються веб-службою під час її виклику.
Щоразу, коли клієнтська програма викликає метод у веб-службі, веб-служба автоматично генерує повідомлення SOAP, яке міститиме необхідні деталі даних, які будуть надіслані з веб-служби клієнтській програмі.
Як обговорювалося в попередній темі цього посібника з SOAP, просте повідомлення SOAP має такі елементи:
- Елемент «Конверт».
- Елемент заголовка та
- Елемент тіла
- Елемент Fault (необов'язково)
Давайте розглянемо наведений нижче приклад простого SOAP-повідомлення та подивимося, що насправді робить кожен елемент.

- Як видно з наведеного вище повідомлення SOAP, перша частина повідомлення SOAP є елементом конверта, який використовується для інкапсуляції всього повідомлення SOAP.
- Наступним елементом є тіло SOAP, яке містить деталі фактичного повідомлення.
- Наше повідомлення містить веб-сервіс під назвою «Guru99Вебсервіс”.
- ПодіяGuru«99Webservice» приймає параметр типу «int» та має назву TutorialID.
Тепер наведене вище повідомлення SOAP буде передано між веб-службою та клієнтською програмою.
Ви можете бачити, наскільки корисною є вищезазначена інформація для клієнтської програми. Повідомлення SOAP повідомляє клієнтській програмі назву веб-сервісу, а також які параметри він очікує, а також який тип кожного параметра, який приймає веб-сервіс.
Елемент конверта SOAP
Перший шматок будівельного блоку — це конверт SOAP.
Конверт SOAP використовується для інкапсуляції всіх необхідних деталей повідомлень SOAP, якими обмінюються веб-служба та клієнтська програма.
Елемент конверта SOAP використовується для позначення початку та кінця повідомлення SOAP. Це дозволяє клієнтській програмі, яка викликає веб-службу, знати, коли закінчується повідомлення SOAP.
На елементі конверта SOAP можна звернути увагу на наступні моменти.
- Кожне SOAP-повідомлення повинно мати кореневий елемент конверта. Абсолютно обов'язково, щоб SOAP-повідомлення мало елемент конверта.
- Кожен елемент Envelope повинен мати принаймні один елемент мильного тіла.
- Якщо елемент Envelope містить елемент заголовка, він повинен містити не більше одного, і він має з’являтися як перший дочірній елемент Envelope перед елементом body.
- Конверт змінюється, коли змінюються версії SOAP.
- SOAP-процесор, сумісний з v1.1, створює помилку після отримання повідомлення, що містить простір імен конверта v1.2.
- SOAP-процесор, сумісний із v1.2, генерує помилку Version Mismatch, якщо отримує повідомлення, яке не містить простору імен конверта v1.2.
Нижче наведено приклад SOAP API версії 1.2 елемента SOAP envelop.
<?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <Guru99WebService xmlns="http://tempuri.org/"> <TutorialID>int</TutorialID> </Guru99WebService> </soap:Body> </SOAP-ENV:Envelope>
Повідомлення про помилку
Коли до веб-сервісу SOAP надсилається запит, повернена відповідь може мати два типи: успішну відповідь або відповідь про помилку. У разі успішного виконання відповідь від сервера завжди буде повідомленням SOAP. Але якщо генеруються помилки SOAP, вони повертаються як помилки «HTTP 500».
Повідомлення про помилку SOAP складається з таких елементів.
- <faultCode> – Це код, який позначає код помилки. Код помилки може мати будь-яке з наведених нижче значень:
- SOAP-ENV:VersionMismatch – це коли виявляється недійсний простір імен для елемента SOAP Envelope.
- SOAP-ENV:MustUnderstand – безпосередній дочірній елемент елемента Header з атрибутом mustUnderstand, встановленим на «1», не було зрозуміло.
- SOAP-ENV:Client – повідомлення було сформовано неправильно або містило неправильну інформацію.
- SOAP-ENV:Сервер – виникла проблема із сервером, тому повідомлення не вдалося продовжити.
- – Це текстове повідомлення з детальним описом помилки.
- (необов'язково) – Це текстовий рядок, який вказує, хто спричинив помилку.
- (Необов'язково) – Це елемент для повідомлень про помилки, що стосуються конкретної програми. Тому програма може мати певне повідомлення про помилку для різних сценаріїв бізнес-логіки.
Приклад повідомлення про помилку
Приклад повідомлення про помилку наведено нижче. Помилка генерується у сценарії, коли клієнт намагається використати метод під назвою TutorialID у класі GetTutorial. Наведене нижче повідомлення про помилку генерується у випадку, якщо метод не існує у визначеному класі.
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type="xsd:string"> Failed to locate method (GetTutorialID) in class (GetTutorial) </faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
вихід:
Коли ви виконуєте наведений вище код, з’явиться помилка типу «Не вдалося знайти метод (GetTutorialID) у класі (GetTutorial)».
Модель зв'язку SOAP
Весь зв'язок через SOAP здійснюється через протокол HTTP. До SOAP багато веб-сервіси використовував стандартний стиль RPC (Remote Procedure Call) для спілкування. Це був найпростіший вид спілкування, але він мав багато обмежень.
Тепер у цьому посібнику з SOAP API розглянемо наведену нижче діаграму, щоб побачити, як працює цей зв'язок. У цьому прикладі припустимо, що сервер розміщує веб-сервіс, який надає 2 методи:
- GetEmployee – Це дозволить отримати всі дані про співробітника.
- SetEmployee – Це відповідно встановить значення таких деталей, як відділ співробітника, зарплата тощо.
У звичайному стилі спілкування RPC клієнт просто викликає методи у своєму запиті та надсилає необхідні параметри на сервер, а сервер надсилає бажану відповідь.
Вищезазначена модель комунікації має наступні серйозні обмеження:
- Не залежить від мови – Сервер, на якому розміщені методи, буде написаний певною мовою програмування, і зазвичай виклики до сервера будуть здійснюватися лише цією мовою програмування.
- Не стандартний протокол – Коли здійснюється виклик до віддаленої процедури, виклик не здійснюється через стандартний протокол. Це була проблема, оскільки здебільшого всі комунікації через Інтернет мали здійснюватися через протокол HTTP.
- Брандмауери – Оскільки виклики RPC не проходять через звичайний протокол, на сервері мають бути відкриті окремі порти, щоб дозволити клієнту спілкуватися з сервером. Зазвичай усі брандмауери блокували б цей тип трафіку, і, як правило, потрібно було багато налаштувати, щоб забезпечити роботу такого роду зв’язку між клієнтом і сервером.
Щоб подолати всі вищезазначені обмеження, SOAP використовуватиме наведену нижче модель зв'язку.
- Клієнт форматував інформацію про виклик процедури та будь-які аргументи в SOAP-повідомлення та надсилав його на сервер як частину HTTP-запиту. Цей процес інкапсуляції даних у SOAP-повідомлення був відомий як Маршируючий.
- Потім сервер розгортає повідомлення, надіслане клієнтом, бачить, що запитує клієнт, а потім надсилає відповідну відповідь клієнту як SOAP-повідомлення. Практика розгортанняping запит, надісланий клієнтом, називається Демаршалінг.
Практичний приклад SOAP
Тепер у цьому SoapUI У цьому посібнику давайте розглянемо практичний приклад SOAP. Ймовірно, один із найкращих способів побачити, як генеруються SOAP-повідомлення, – це побачити веб-сервіс у дії.
У цій темі буде розглянуто використання Microsoft.Net framework для створення веб-сервісу ASMX. Цей тип веб-служби підтримує як SOAP версії 1.1, так і версії 1.2.
Веб-служби ASMX автоматично генерують Мова визначення веб-служб (WSDL) документ. Цей документ WSDL потрібен клієнтській програмі, яка викликає, щоб програма знала, що може робити веб-служба.
У нашому прикладі ми створимо простий веб-сервіс, який використовуватиметься для повернення рядка до програми, що викликає веб-сервіс. Цей веб-сервіс буде розміщено в Asp.Net веб-додаток. Потім ми викличемо веб-службу та побачимо результат, який повертає веб-служба.
Visual Studio також покаже нам, що таке SOAP-повідомлення, що передається між веб-сервісом та викликаючою програмою. Першу передумову для налаштування нашої веб-сервісної програми можна виконати, виконавши наведені нижче кроки. Для цього прикладу переконайтеся, що у вашій системі встановлено Visual Studio 2013.
Крок 1) Першим кроком є створення пустої веб-програми ASP.Net. У Visual Studio 2013 клацніть пункт меню Файл->Новий проект.
Після того, як ви клацнете опцію «Новий проект», Visual Studio відкриє ще одне діалогове вікно для вибору типу проекту та надання необхідних деталей проекту. Це пояснюється в наступному кроці.
Крок 2) На цьому етапі
- Обов’язково спочатку виберіть C# Веб-шаблон веб-застосунку ASP.NET. Проект має бути такого типу, щоб можна було створити проект SOAP-сервісів. Вибравши цей параметр, Visual Studio виконає необхідні кроки для додавання файлів, необхідних для будь-якого веб-застосунку.
- Введіть назву для вашого проєкту, у нашому випадку це webservice.asmx. Потім обов’язково вкажіть місце, де будуть зберігатися файли проєкту.
Після завершення ви побачите створений файл проекту у вашому провіднику рішень у Visual Studio 2013.
Крок 3) На цьому кроці ми додамо файл веб-сервісу до нашого проєкту.
- Спочатку клацніть правою кнопкою миші на файлі проекту, як показано нижче.
- Після того, як ви клацнете правою кнопкою миші на файлі проекту, у вас буде можливість вибрати опцію «Додати->Веб-сервіс (ASMX)», щоб додати файл веб-сервісу. Просто вкажіть назву Tutorial Service для файлу назви веб-сервісу.
Крок 4) Додайте наведений нижче код до asmx-файлу Tutorial Service.
Code Пояснення:
- Цей рядок коду надає ім’я файлу веб-служби. Це важливий крок, оскільки він дає можливість клієнтській програмі викликати веб-службу за допомогою імені веб-служби.
- Зазвичай файл класу використовується для інкапсуляції функціональності веб-сервісу. Таким чином, файл класу буде містити визначення всіх веб-методів, які нададуть певну функціональність клієнтській програмі.
- Тут [WebMethod] відомий як атрибут, який описує функцію. Наступний крок створює функцію під назвою «Guru99WebService”, але завдяки включенню цього кроку додавання атрибута [WebMethod] гарантується, що цей метод може бути викликаний клієнтською програмою. Якщо цей атрибут відсутній, то метод ніколи не може бути викликаний клієнтською програмою.
- Тут ми визначаємо функцію під назвою 'Guru99WebService', яка буде використана для повернення рядка до клієнтської програми, що її викликає. Ця функція є веб-сервісом, який може бути викликаний будь-якою клієнтською програмою.
- Ми використовуємо оператор return, щоб повернути рядок «Це Guru99 Веб-сервіс» до клієнтської програми.
Якщо код виконано успішно, під час запуску коду в браузері буде показано наступний результат.
вихід:
- Вивід чітко показує, що назва нашого веб-сервісу — «Guru99 Веб-сервіс», що є результатом надання назви нашому веб-сервісу.
- Ми також бачимо, що можемо викликати веб-сервіс. Якщо ми натиснемо кнопку «Викликати», ми отримаємо наведену нижче відповідь у веб-браузері.
Вищезазначений результат:
- Це чітко показує, що при виклику веб-методу рядок «Це GuruПовертається «99 Веб-сервіс».
- Visual Studio також дозволяє переглядати запит і відповідь на повідомлення SOAP, які генеруються під час виклику вищезазначеної веб-служби.
Нижче показано запит SOAP, який створюється під час виклику веб-служби.
Code Пояснення:
- Перша частина SOAP-повідомлення – це елемент конверта, який обговорювався в попередніх розділах. Це елемент інкапсуляції, присутній у кожному SOAP-повідомленні.
- Тіло SOAP є наступним елементом і містить фактичні деталі повідомлення SOAP.
- Третя частина — це елемент, який вказує, що ми хочемо викликати сервіс, який називається 'Guru99Веб-сервіс'.
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <Guru99WebServiceResponse xmlns="http://tempuri.org/"> <Guru99WebServiceResult>string</Guru99WebServiceResult> </Guru99WebServiceResponse> </soap:Body> </soap:Envelope>
Code Пояснення:
- Перша частина SOAP-повідомлення – це елемент конверта, який обговорювався в попередніх розділах. Це елемент інкапсуляції, присутній у кожному SOAP-повідомленні.
- Тіло SOAP є наступним елементом і містить фактичні деталі повідомлення SOAP.
- Цікава частина, яку ви зараз побачите, це атрибут «рядок». Він повідомляє клієнтській програмі, що викликаний веб-сервіс повертає об'єкт типу рядок. Це дуже корисно, оскільки інакше клієнтська програма не знала б, що повертає веб-сервіс.














