> For the complete documentation index, see [llms.txt](https://docs.system-analyst-base.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.system-analyst-base.ru/hard-skills/integracii/vidy-integracii/sinkhronnoe-vzaimodeistvie/soap.md).

# SOAP

{% hint style="info" %}
**SOAP** — это протокол, по которому веб-сервисы взаимодействуют друг с другом или с клиентами. Название происходит от сокращения Simple Object Access Protocol («простой протокол доступа к объектам»).&#x20;

SOAP API — это веб-сервис, использующий протокол SOAP для обмена сообщениями между серверами и клиентами. При этом сообщения должны быть написаны на языке XML в соответствии со строгими стандартами [WSDL](/hard-skills/integracii/vidy-integracii/sinkhronnoe-vzaimodeistvie/soap/wsdl.md), иначе сервер вернет ошибку.
{% endhint %}

## **Структура SOAP запроса**

### **Envelope («конверт»)**

Это корневой элемент. Определяет XML-документ как сообщение SOAP с помощью пространства имен xmlns:soap=»<http://www.w3.org/2003/05/soap-envelope/»>. Если в определении будет указан другой адрес, сервер вернет ошибку.

### **Header («заголовок»)**

Включает в себя атрибуты сообщения, связанные с конкретным приложением (аутентификация, проведение платежей и так далее). В заголовке могут использоваться три атрибута, которые указывают, как принимающая сторона должна обрабатывать сообщение, — **mustUnderstand**, **actor** и **encodingStyle.** Значение **mustUnderstand** — 1 или 0 — говорит принимающему приложению о том, следует ли распознавать заголовок в обязательном или опциональном порядке. Атрибут **actor** задает конкретную конечную точку для сообщения. Атрибут **encodingStyle** устанавливает специфическую кодировку для элемента. По умолчанию SOAP-сообщение не имеет определенной кодировки.

### **Body («тело»)**

Сообщение, которое передает веб-приложение. Может содержать запрос к серверу или ответ от него.

<details>

<summary>Пример запрос/ответа XML</summary>

*Пример сообщения, которое запрашивает стоимость ноутбука в онлайн-магазине:*

```xml
<?xml version="1.0"?>
<soap:Envelope
	xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
	soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body> 
	<m:GetPrice xmlns:m="https://online-shop.ru/prices">
		<m:Item>Dell Vostro 3515-5371</m:Item>
	</m:GetPrice>
</soap:Body>
</soap:Envelope>
```

*Пример ответа сервера онлайн-магазина:*

```xml
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
	soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
	<m:GetPriceResponse xmlns:m="https://online-shop.ru/prices">
		<m:Price>37299</m:Price>
	</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
```

</details>

### **Fault («ошибка»)**

Опциональный элемент. Передает уведомление об ошибках, если они возникли в ходе обработки сообщения. Может содержать вложенные элементы, которые проясняют причину возникновения ошибки:

* **faultcode** — код неполадки;
* **faultstring** — «человекопонятное» описание проблемы;
* **faultactor** — информация о программном компоненте, который вызвал ошибку;
* **detail** — дополнительные сведения о месте возникновения неполадки.

## В каких случаях используют SOAP <a href="#v-kakikh-sluchayakh-ispolzuyut-soap" id="v-kakikh-sluchayakh-ispolzuyut-soap"></a>

* **В интеграции сложных систем.** SOAP поддерживает передачу сложных объектов и атрибутов, что позволяет эффективно обмениваться данными между системами.
* **Когда есть необходимость в строгих стандартах безопасности с поддержкой SSL.** SOAP API использует WS-Security для обеспечения безопасности приложений на уровне предприятия и для связи с унаследованными системами.
* **Когда нужны надежные функции обмена сообщениями.** Если вам необходимо гарантировать, что сообщения будут доставлены в надежном порядке и без потерь, то SOAP API обеспечит надежную доставку сообщений между системами при помощи расширения WS-ReliableMessaging.
* **Когда необходимо сохранить конфиденциальность.** SOAP API включает в себя соответствие стандарту ACID (Atomicity, Consistency, Isolation, and Durability) и это соответствие уменьшает избыточность и повышает безопасность и целостность сообщений.

### Недостатки SOAP <a href="#d0-bd-d0-b5-d0-b4-d0-be-d1-81-d1-82-d0-b0-d1-82-d0-ba-d0-b8-soap" id="d0-bd-d0-b5-d0-b4-d0-be-d1-81-d1-82-d0-b0-d1-82-d0-ba-d0-b8-soap"></a>

* **Объемные сообщения:** SOAP API использует XML для сериализации данных, что приводит к увеличению объема передаваемых сообщений. Проблемы возникают при передаче больших объемов данных или при работе с медленными сетевыми соединениями.
* **Поддержка только одного формата:** SOAP API ограничен использованием только XML в качестве формата данных. В некоторых случаях это может означать дополнительные накладные расходы на преобразование данных из других форматов в XML и обратно.
* **Один запрос — один ответ (один end-point):** клиент должен отправить запрос и дождаться ответа от сервера, прежде чем продолжить выполнение следующих операций. Это может привести к блокировке клиентского приложения, если запрос долго обрабатывается.
* **Возможность нарушения работы клиента при смене описания веб-сервиса:** смена описания потребует дополнительных усилий для согласования изменений между поставщиком и потребителем сервиса.

Источники:&#x20;

* <https://habr.com/ru/companies/itq_group/articles/705598/>
* <https://blog.skillfactory.ru/glossary/soap-api/>
* <https://elbrusboot.camp/blog/soap-api/>
