HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <h2>SOAP API</h2>
1 <h2>SOAP API</h2>
2 <p><strong>SOAP API</strong>- это способ, с помощью которого программы обмениваются сообщениями по сети. Расшифровка -<strong>Simple Object Access Protocol</strong>("простой протокол доступа к объектам"). Если объяснить простыми словами, SOAP - это<strong>правила для обмена структурированными XML-сообщениями</strong>между приложениями через интернет или корпоративные сети.</p>
2 <p><strong>SOAP API</strong>- это способ, с помощью которого программы обмениваются сообщениями по сети. Расшифровка -<strong>Simple Object Access Protocol</strong>("простой протокол доступа к объектам"). Если объяснить простыми словами, SOAP - это<strong>правила для обмена структурированными XML-сообщениями</strong>между приложениями через интернет или корпоративные сети.</p>
3 <p>SOAP появился еще в конце 1990-х годов и стал основой множества корпоративных интеграций. Несмотря на рост популярности REST и GraphQL,<strong>simple object access protocol</strong>до сих пор активно используется там, где важны<strong>строгие контракты, безопасность, надёжность</strong>- в банках, телекомах, госуслугах, крупных корпоративных системах.</p>
3 <p>SOAP появился еще в конце 1990-х годов и стал основой множества корпоративных интеграций. Несмотря на рост популярности REST и GraphQL,<strong>simple object access protocol</strong>до сих пор активно используется там, где важны<strong>строгие контракты, безопасность, надёжность</strong>- в банках, телекомах, госуслугах, крупных корпоративных системах.</p>
4 <h2>Где используется сегодня</h2>
4 <h2>Где используется сегодня</h2>
5 <p>SOAP-веб-сервисы чаще всего встречаются:</p>
5 <p>SOAP-веб-сервисы чаще всего встречаются:</p>
6 <ul><li><p>в<strong>банковских API</strong>(платёжные шлюзы, валютные курсы, отчётность);</p>
6 <ul><li><p>в<strong>банковских API</strong>(платёжные шлюзы, валютные курсы, отчётность);</p>
7 </li>
7 </li>
8 <li><p>у<strong>телеком-операторов</strong>(биллинговые системы, роуминг, CRM);</p>
8 <li><p>у<strong>телеком-операторов</strong>(биллинговые системы, роуминг, CRM);</p>
9 </li>
9 </li>
10 <li><p>в<strong>государственных сервисах</strong>(Госуслуги, ЕГАИС, СМЭВ);</p>
10 <li><p>в<strong>государственных сервисах</strong>(Госуслуги, ЕГАИС, СМЭВ);</p>
11 </li>
11 </li>
12 <li><p>в<strong>ERP, интеграционных шинах</strong>(SAP, Oracle, 1С, BizTalk).</p>
12 <li><p>в<strong>ERP, интеграционных шинах</strong>(SAP, Oracle, 1С, BizTalk).</p>
13 </li>
13 </li>
14 </ul><p>Сервисы удобны там, где нужно не просто "передать данные", а строго следовать<strong>описанному контракту (WSDL)</strong>и обеспечивать надежность, безопасность сообщений.</p>
14 </ul><p>Сервисы удобны там, где нужно не просто "передать данные", а строго следовать<strong>описанному контракту (WSDL)</strong>и обеспечивать надежность, безопасность сообщений.</p>
15 <h2>Архитектура SOAP и стек WS-*</h2>
15 <h2>Архитектура SOAP и стек WS-*</h2>
16 <p>SOAP - это не просто XML, а часть большого<strong>WS-стека (Web Services)</strong>. Основные компоненты:</p>
16 <p>SOAP - это не просто XML, а часть большого<strong>WS-стека (Web Services)</strong>. Основные компоненты:</p>
17 <ul><li><p><strong>SOAP</strong>- формат сообщений, правил обмена;</p>
17 <ul><li><p><strong>SOAP</strong>- формат сообщений, правил обмена;</p>
18 </li>
18 </li>
19 <li><p><strong>WSDL</strong>- контракт, описывающий, какие методы / данные поддерживает сервис;</p>
19 <li><p><strong>WSDL</strong>- контракт, описывающий, какие методы / данные поддерживает сервис;</p>
20 </li>
20 </li>
21 <li><p><strong>WS-Addressing</strong>- задаёт маршрутизацию сообщений;</p>
21 <li><p><strong>WS-Addressing</strong>- задаёт маршрутизацию сообщений;</p>
22 </li>
22 </li>
23 <li><p><strong>WS-Security</strong>- обеспечивает подписи, шифрование, аутентификацию;</p>
23 <li><p><strong>WS-Security</strong>- обеспечивает подписи, шифрование, аутентификацию;</p>
24 </li>
24 </li>
25 <li><p><strong>WS-ReliableMessaging</strong>- отвечает за гарантированную доставку;</p>
25 <li><p><strong>WS-ReliableMessaging</strong>- отвечает за гарантированную доставку;</p>
26 </li>
26 </li>
27 <li><p><strong>WS-AtomicTransaction</strong>- координирует распределенные транзакции.</p>
27 <li><p><strong>WS-AtomicTransaction</strong>- координирует распределенные транзакции.</p>
28 </li>
28 </li>
29 </ul><p>Таким образом, SOAP - это фундамент, на котором строится целый стек надежных веб-сервисов.</p>
29 </ul><p>Таким образом, SOAP - это фундамент, на котором строится целый стек надежных веб-сервисов.</p>
30 <h2>Из чего состоит сообщение SOAP</h2>
30 <h2>Из чего состоит сообщение SOAP</h2>
31 <p>SOAP-сообщение всегда представляет собой XML-документ со структурой:</p>
31 <p>SOAP-сообщение всегда представляет собой XML-документ со структурой:</p>
32 <p><strong>Основные элементы:</strong></p>
32 <p><strong>Основные элементы:</strong></p>
33 <ul><li><p><strong>Envelope</strong>- оболочка всего сообщения.</p>
33 <ul><li><p><strong>Envelope</strong>- оболочка всего сообщения.</p>
34 </li>
34 </li>
35 <li><p><strong>Header</strong>- метаданные (авторизация, маршрутизация, подписи).</p>
35 <li><p><strong>Header</strong>- метаданные (авторизация, маршрутизация, подписи).</p>
36 </li>
36 </li>
37 <li><p><strong>Body</strong>- основное содержимое (запрос или ответ).</p>
37 <li><p><strong>Body</strong>- основное содержимое (запрос или ответ).</p>
38 </li>
38 </li>
39 <li><p><strong>Fault</strong>- описание ошибки.</p>
39 <li><p><strong>Fault</strong>- описание ошибки.</p>
40 </li>
40 </li>
41 </ul><h3>SOAP 1.1 vs SOAP 1.2</h3>
41 </ul><h3>SOAP 1.1 vs SOAP 1.2</h3>
42 <ul><li><p>В SOAP 1.2 используется атрибут soap:role вместо actor.</p>
42 <ul><li><p>В SOAP 1.2 используется атрибут soap:role вместо actor.</p>
43 </li>
43 </li>
44 <li><p>mustUnderstand - булев (true/false), а не числовой (1/0).</p>
44 <li><p>mustUnderstand - булев (true/false), а не числовой (1/0).</p>
45 </li>
45 </li>
46 <li><p>Кодировки, пространства имён отличаются, поэтому версии несовместимы.</p>
46 <li><p>Кодировки, пространства имён отличаются, поэтому версии несовместимы.</p>
47 </li>
47 </li>
48 <li><p>SOAP 1.2 - сам по себе<strong>не гарантирует надёжность</strong>; она обеспечивается<strong>WS-ReliableMessaging</strong>.</p>
48 <li><p>SOAP 1.2 - сам по себе<strong>не гарантирует надёжность</strong>; она обеспечивается<strong>WS-ReliableMessaging</strong>.</p>
49 </li>
49 </li>
50 </ul><h2>Примеры XML для запроса и ответа</h2>
50 </ul><h2>Примеры XML для запроса и ответа</h2>
51 <p><strong>Пример запроса:</strong></p>
51 <p><strong>Пример запроса:</strong></p>
52 <p><strong>Пример ответа:</strong></p>
52 <p><strong>Пример ответа:</strong></p>
53 <p><strong>Ошибка (Fault):</strong></p>
53 <p><strong>Ошибка (Fault):</strong></p>
54 <h2>Формат данных и вложения</h2>
54 <h2>Формат данных и вложения</h2>
55 <p>Основной формат данных в SOAP -<strong>XML</strong>, но возможны вложения:</p>
55 <p>Основной формат данных в SOAP -<strong>XML</strong>, но возможны вложения:</p>
56 <ul><li><p><strong>MTOM/XOP</strong>- передача бинарных файлов (например, PDF, изображений) в виде вложений, а не base64 внутри XML.</p>
56 <ul><li><p><strong>MTOM/XOP</strong>- передача бинарных файлов (например, PDF, изображений) в виде вложений, а не base64 внутри XML.</p>
57 </li>
57 </li>
58 <li><p><strong>base64Binary</strong>- альтернатива, если MTOM не поддерживается.</p>
58 <li><p><strong>base64Binary</strong>- альтернатива, если MTOM не поддерживается.</p>
59 </li>
59 </li>
60 </ul><p>Это делает SOAP гибким для сложных интеграций, где нужны документы, медиафайлы.</p>
60 </ul><p>Это делает SOAP гибким для сложных интеграций, где нужны документы, медиафайлы.</p>
61 <h2>Транспорт и HTTP SOAP</h2>
61 <h2>Транспорт и HTTP SOAP</h2>
62 <p>Чаще всего SOAP работает поверх<strong>HTTP/HTTPS</strong>.</p>
62 <p>Чаще всего SOAP работает поверх<strong>HTTP/HTTPS</strong>.</p>
63 <p>Типичные заголовки:</p>
63 <p>Типичные заголовки:</p>
64 <p><strong>SOAP 1.1</strong></p>
64 <p><strong>SOAP 1.1</strong></p>
65 <p>POST /service HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "GetBalance"</p>
65 <p>POST /service HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "GetBalance"</p>
66 <p><strong>SOAP 1.2</strong></p>
66 <p><strong>SOAP 1.2</strong></p>
67 <p>POST /service HTTP/1.1 Content-Type: application/soap+xml; charset=utf-8; action="GetBalance"</p>
67 <p>POST /service HTTP/1.1 Content-Type: application/soap+xml; charset=utf-8; action="GetBalance"</p>
68 <p>При ошибках сервис может вернуть<strong>HTTP 500</strong>(Fault) или<strong>200</strong>(успешный ответ).</p>
68 <p>При ошибках сервис может вернуть<strong>HTTP 500</strong>(Fault) или<strong>200</strong>(успешный ответ).</p>
69 <p>Кроме HTTP, возможны альтернативные транспорты -<strong>SMTP, JMS, MQ,</strong>другие.</p>
69 <p>Кроме HTTP, возможны альтернативные транспорты -<strong>SMTP, JMS, MQ,</strong>другие.</p>
70 <h2>Стили и кодирование</h2>
70 <h2>Стили и кодирование</h2>
71 <p>SOAP поддерживает два стиля:</p>
71 <p>SOAP поддерживает два стиля:</p>
72 <ul><li><p><strong>RPC (Remote Procedure Call)</strong>- имитирует вызов функции.</p>
72 <ul><li><p><strong>RPC (Remote Procedure Call)</strong>- имитирует вызов функции.</p>
73 </li>
73 </li>
74 <li><p><strong>Document</strong>- передаёт документы с данными (рекомендуется).</p>
74 <li><p><strong>Document</strong>- передаёт документы с данными (рекомендуется).</p>
75 </li>
75 </li>
76 </ul><p>По способу кодирования:</p>
76 </ul><p>По способу кодирования:</p>
77 <ul><li><p><strong>encoded</strong>- старый формат (SOAP encoding);</p>
77 <ul><li><p><strong>encoded</strong>- старый формат (SOAP encoding);</p>
78 </li>
78 </li>
79 <li><p><strong>literal</strong>- предпочтительный, совместимый с WS-I Basic Profile.</p>
79 <li><p><strong>literal</strong>- предпочтительный, совместимый с WS-I Basic Profile.</p>
80 </li>
80 </li>
81 </ul><h2>Контракт: WSDL "для чайников"</h2>
81 </ul><h2>Контракт: WSDL "для чайников"</h2>
82 <p>Файл<strong>WSDL (Web Services Description Language)</strong>- это XML-контракт, описывающий:</p>
82 <p>Файл<strong>WSDL (Web Services Description Language)</strong>- это XML-контракт, описывающий:</p>
83 <ul><li><p><strong>types</strong>- используемые структуры данных (XSD);</p>
83 <ul><li><p><strong>types</strong>- используемые структуры данных (XSD);</p>
84 </li>
84 </li>
85 <li><p><strong>message</strong>- входные / выходные сообщения;</p>
85 <li><p><strong>message</strong>- входные / выходные сообщения;</p>
86 </li>
86 </li>
87 <li><p><strong>portType</strong>- операции (методы);</p>
87 <li><p><strong>portType</strong>- операции (методы);</p>
88 </li>
88 </li>
89 <li><p><strong>binding</strong>- способ передачи (SOAP 1.1/1.2);</p>
89 <li><p><strong>binding</strong>- способ передачи (SOAP 1.1/1.2);</p>
90 </li>
90 </li>
91 <li><p><strong>service</strong>- адреса (endpoint’ы).</p>
91 <li><p><strong>service</strong>- адреса (endpoint’ы).</p>
92 </li>
92 </li>
93 </ul><p>Клиент по WSDL может автоматически сгенерировать код:</p>
93 </ul><p>Клиент по WSDL может автоматически сгенерировать код:</p>
94 <ul><li><p>Java: wsimport;</p>
94 <ul><li><p>Java: wsimport;</p>
95 </li>
95 </li>
96 <li><p>.NET: svcutil;</p>
96 <li><p>.NET: svcutil;</p>
97 </li>
97 </li>
98 <li><p>Python: zeep.</p>
98 <li><p>Python: zeep.</p>
99 </li>
99 </li>
100 </ul><h2>Синхронный или асинхронный</h2>
100 </ul><h2>Синхронный или асинхронный</h2>
101 <p>SOAP-вызовы могут быть:</p>
101 <p>SOAP-вызовы могут быть:</p>
102 <ul><li><p><strong>синхронными</strong>(request/response);</p>
102 <ul><li><p><strong>синхронными</strong>(request/response);</p>
103 </li>
103 </li>
104 <li><p><strong>асинхронными</strong>- с колбэками или polling (опросом).</p>
104 <li><p><strong>асинхронными</strong>- с колбэками или polling (опросом).</p>
105 </li>
105 </li>
106 </ul><p>Для связывания запросов / ответов используют<strong>correlation IDs</strong>.</p>
106 </ul><p>Для связывания запросов / ответов используют<strong>correlation IDs</strong>.</p>
107 <h2>Обработка ошибок</h2>
107 <h2>Обработка ошибок</h2>
108 <p>В SOAP 1.1 ошибка описывается через &lt;soap:Fault&gt;, а в 1.2 - структура изменена:</p>
108 <p>В SOAP 1.1 ошибка описывается через &lt;soap:Fault&gt;, а в 1.2 - структура изменена:</p>
109 <p>Ошибки обычно маппятся на<strong>HTTP 500</strong>(внутренняя ошибка) или<strong>400</strong>(некорректный запрос).</p>
109 <p>Ошибки обычно маппятся на<strong>HTTP 500</strong>(внутренняя ошибка) или<strong>400</strong>(некорректный запрос).</p>
110 <h2>Безопасность и надежность</h2>
110 <h2>Безопасность и надежность</h2>
111 <p>SOAP сам по себе не шифрует, не подписывает данные - это делают расширения:</p>
111 <p>SOAP сам по себе не шифрует, не подписывает данные - это делают расширения:</p>
112 <ul><li><p><strong>WS-Security</strong>- подпись, шифрование, токены:</p>
112 <ul><li><p><strong>WS-Security</strong>- подпись, шифрование, токены:</p>
113 <ul><li>UsernameToken, X.509, SAML;</li>
113 <ul><li>UsernameToken, X.509, SAML;</li>
114 </ul></li>
114 </ul></li>
115 <li><p><strong>WS-ReliableMessaging</strong>- гарантирует доставку, порядок сообщений;</p>
115 <li><p><strong>WS-ReliableMessaging</strong>- гарантирует доставку, порядок сообщений;</p>
116 </li>
116 </li>
117 <li><p><strong>WS-Policy</strong>- описывает требования к безопасности;</p>
117 <li><p><strong>WS-Policy</strong>- описывает требования к безопасности;</p>
118 </li>
118 </li>
119 <li><p><strong>TLS/HTTPS</strong>- защищает транспорт.</p>
119 <li><p><strong>TLS/HTTPS</strong>- защищает транспорт.</p>
120 </li>
120 </li>
121 </ul><h2>Практика и инструменты</h2>
121 </ul><h2>Практика и инструменты</h2>
122 <p><strong>Тестирование:</strong></p>
122 <p><strong>Тестирование:</strong></p>
123 <ul><li><p><strong>SoapUI</strong>- популярный инструмент для создания / отладки запросов;</p>
123 <ul><li><p><strong>SoapUI</strong>- популярный инструмент для создания / отладки запросов;</p>
124 </li>
124 </li>
125 <li><p><strong>Postman</strong>- тоже поддерживает SOAP (через XML-тело);</p>
125 <li><p><strong>Postman</strong>- тоже поддерживает SOAP (через XML-тело);</p>
126 </li>
126 </li>
127 <li><p><strong>cURL</strong>- можно отправить вручную:</p>
127 <li><p><strong>cURL</strong>- можно отправить вручную:</p>
128 </li>
128 </li>
129 </ul><p>curl -X POST -H "Content-Type: text/xml" -d @request.xml https://example.org/service</p>
129 </ul><p>curl -X POST -H "Content-Type: text/xml" -d @request.xml https://example.org/service</p>
130 <p><strong>Генерация клиента:</strong></p>
130 <p><strong>Генерация клиента:</strong></p>
131 <ul><li><p>Java: wsimport;</p>
131 <ul><li><p>Java: wsimport;</p>
132 </li>
132 </li>
133 <li><p>.NET: svcutil;</p>
133 <li><p>.NET: svcutil;</p>
134 </li>
134 </li>
135 <li><p>Python: zeep.</p>
135 <li><p>Python: zeep.</p>
136 </li>
136 </li>
137 </ul><h2>Сравнение SOAP и REST</h2>
137 </ul><h2>Сравнение SOAP и REST</h2>
138 <p><strong>Выбирают SOAP</strong>, если важны безопасность, транзакции, строгие контракты.</p>
138 <p><strong>Выбирают SOAP</strong>, если важны безопасность, транзакции, строгие контракты.</p>
139 <p><strong>REST</strong>- когда нужна простота, скорость.</p>
139 <p><strong>REST</strong>- когда нужна простота, скорость.</p>
140 <h2>Частые проблемы и отладка</h2>
140 <h2>Частые проблемы и отладка</h2>
141 <ul><li><p>Ошибки в<strong>namespace (xmlns)</strong>- частая причина "Invalid SOAP message".</p>
141 <ul><li><p>Ошибки в<strong>namespace (xmlns)</strong>- частая причина "Invalid SOAP message".</p>
142 </li>
142 </li>
143 <li><p>Несовпадение типов XSD при сериализации.</p>
143 <li><p>Несовпадение типов XSD при сериализации.</p>
144 </li>
144 </li>
145 <li><p>Большие вложения → включают MTOM.</p>
145 <li><p>Большие вложения → включают MTOM.</p>
146 </li>
146 </li>
147 <li><p>Проблемы с таймаутами, SSL-сертификатами.</p>
147 <li><p>Проблемы с таймаутами, SSL-сертификатами.</p>
148 </li>
148 </li>
149 </ul><h2>FAQ по ключам</h2>
149 </ul><h2>FAQ по ключам</h2>
150 <ul><li><p><strong>SOAP-запрос - это</strong>XML-сообщение, отправляемое клиентом на сервер.</p>
150 <ul><li><p><strong>SOAP-запрос - это</strong>XML-сообщение, отправляемое клиентом на сервер.</p>
151 </li>
151 </li>
152 <li><p><strong>Envelope SOAP</strong>- внешняя оболочка сообщения.</p>
152 <li><p><strong>Envelope SOAP</strong>- внешняя оболочка сообщения.</p>
153 </li>
153 </li>
154 <li><p><strong>SOAP-метод</strong>- операция, определенная в WSDL.</p>
154 <li><p><strong>SOAP-метод</strong>- операция, определенная в WSDL.</p>
155 </li>
155 </li>
156 <li><p><strong>Формат данных</strong>- XML, с поддержкой MTOM/XOP для бинарных вложений.</p>
156 <li><p><strong>Формат данных</strong>- XML, с поддержкой MTOM/XOP для бинарных вложений.</p>
157 </li>
157 </li>
158 <li><p><strong>HTTP SOAP</strong>- наиболее распространенный транспортный протокол.</p>
158 <li><p><strong>HTTP SOAP</strong>- наиболее распространенный транспортный протокол.</p>
159 </li>
159 </li>
160 </ul><h2>Глоссарий</h2>
160 </ul><h2>Глоссарий</h2>
161 <ul><li><p><strong>Envelope</strong>- контейнер SOAP-сообщения.</p>
161 <ul><li><p><strong>Envelope</strong>- контейнер SOAP-сообщения.</p>
162 </li>
162 </li>
163 <li><p><strong>Header</strong>- метаданные, служебная информация.</p>
163 <li><p><strong>Header</strong>- метаданные, служебная информация.</p>
164 </li>
164 </li>
165 <li><p><strong>Body</strong>- данные запроса или ответа.</p>
165 <li><p><strong>Body</strong>- данные запроса или ответа.</p>
166 </li>
166 </li>
167 <li><p><strong>Fault</strong>- структура ошибки.</p>
167 <li><p><strong>Fault</strong>- структура ошибки.</p>
168 </li>
168 </li>
169 <li><p><strong>WSDL</strong>- описание контракта веб-сервиса.</p>
169 <li><p><strong>WSDL</strong>- описание контракта веб-сервиса.</p>
170 </li>
170 </li>
171 <li><p><strong>binding</strong>- способ передачи данных.</p>
171 <li><p><strong>binding</strong>- способ передачи данных.</p>
172 </li>
172 </li>
173 <li><p><strong>portType</strong>- набор операций сервиса.</p>
173 <li><p><strong>portType</strong>- набор операций сервиса.</p>
174 </li>
174 </li>
175 <li><p><strong>MTOM/XOP</strong>- механизмы передачи бинарных вложений.</p>
175 <li><p><strong>MTOM/XOP</strong>- механизмы передачи бинарных вложений.</p>
176 </li>
176 </li>
177 </ul><h2>Полезные материалы и спецификации</h2>
177 </ul><h2>Полезные материалы и спецификации</h2>
178 <ul><li><p><a>SOAP 1.1 Specification (W3C)</a></p>
178 <ul><li><p><a>SOAP 1.1 Specification (W3C)</a></p>
179 </li>
179 </li>
180 <li><p><a>SOAP 1.2 Part 1: Messaging Framework</a></p>
180 <li><p><a>SOAP 1.2 Part 1: Messaging Framework</a></p>
181 </li>
181 </li>
182 <li><p><a>WSDL 1.1/2.0 Specifications</a></p>
182 <li><p><a>WSDL 1.1/2.0 Specifications</a></p>
183 </li>
183 </li>
184 <li><p>WS-Security Specification</p>
184 <li><p>WS-Security Specification</p>
185 </li>
185 </li>
186 <li><p>WS-ReliableMessaging</p>
186 <li><p>WS-ReliableMessaging</p>
187 </li>
187 </li>
188 <li><p>Обзор SOAP на Habr</p>
188 <li><p>Обзор SOAP на Habr</p>
189 </li>
189 </li>
190 </ul>
190 </ul>