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 ошибка описывается через <soap:Fault>, а в 1.2 - структура изменена:</p>
108
<p>В SOAP 1.1 ошибка описывается через <soap:Fault>, а в 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>