← Назад к вопросам

В чем разница между REST и SOAP?

2.0 Middle🔥 141 комментариев
#REST API и HTTP#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# REST vs SOAP: различия и сравнение

Определение

REST (Representational State Transfer) - архитектурный стиль для веб-сервисов, использующий HTTP методы и стандартные операции.

SOAP (Simple Object Access Protocol) - протокол для обмена структурированной информацией, основанный на XML и часто использующий HTTP.

Краткое сравнение

АспектRESTSOAP
Основан наАрхитектурный стильПротокол
ФорматJSON, XMLТолько XML
ЛегкостьПростойСложный
ПроизводительностьБыстрыйМедленнее
ТипизацияСлабаяСтрогая
СтандартизацияНеформальнаяСтрогая (WSDL)
ИспользованиеModern APIsLegacy системы

REST - Архитектурный стиль

Основные принципы REST

  1. Ресурсы - всё представлено как ресурс
GET /api/users         # Получить всех пользователей
GET /api/users/1       # Получить пользователя с id=1
POST /api/users        # Создать нового пользователя
PUT /api/users/1       # Обновить пользователя
DELETE /api/users/1    # Удалить пользователя
  1. HTTP методы - действия выполняются стандартными методами
GET    - безопасный, идемпотентный
POST   - создание, неидемпотентный
PUT    - обновление, идемпотентный
DELETE - удаление, идемпотентный
  1. Stateless - каждый запрос содержит всю информацию
GET /api/users/1
Authorization: Bearer <token>
# Сервер не помнит предыдущие запросы

Пример REST API

from fastapi import FastAPI

app = FastAPI()

# Ресурсы
users_db = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"}
]

@app.get("/api/users")
def list_users():
    return users_db

@app.get("/api/users/{user_id}")
def get_user(user_id: int):
    return next(u for u in users_db if u["id"] == user_id)

@app.post("/api/users")
def create_user(user: dict):
    users_db.append(user)
    return user

@app.put("/api/users/{user_id}")
def update_user(user_id: int, updated: dict):
    user = next(u for u in users_db if u["id"] == user_id)
    user.update(updated)
    return user

@app.delete("/api/users/{user_id}")
def delete_user(user_id: int):
    global users_db
    users_db = [u for u in users_db if u["id"] != user_id]
    return {"deleted": True}

SOAP - Протокол

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

XML конверт:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap-envelope/">
  <soap:Header>
    <Authentication>
      <Username>alice</Username>
      <Password>secret</Password>
    </Authentication>
  </soap:Header>
  <soap:Body>
    <GetUser xmlns="http://example.com">
      <UserId>1</UserId>
    </GetUser>
  </soap:Body>
</soap:Envelope>

SOAP ответ

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap-envelope/">
  <soap:Body>
    <GetUserResponse xmlns="http://example.com">
      <User>
        <Id>1</Id>
        <Name>Alice</Name>
        <Email>alice@example.com</Email>
      </User>
    </GetUserResponse>
  </soap:Body>
</soap:Envelope>

WSDL (Web Service Description Language)

SOAP обычно использует WSDL для описания:

<wsdl:definitions>
  <wsdl:service name="UserService">
    <wsdl:port name="UserServicePort" binding="UserServiceBinding">
      <soap:address location="http://example.com/soap"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Практические различия

1. Простота использования

REST запрос (просто):

curl -X GET http://api.example.com/users/1

SOAP запрос (сложно):

curl -X POST http://api.example.com/soap   -H "Content-Type: application/soap+xml"   -d @request.xml

2. Размер сообщения

REST (JSON) - маленький:

{"id": 1, "name": "Alice", "email": "alice@example.com"}

SOAP (XML) - большой:

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="...">
  <soap:Body>
    <GetUserResponse>
      <User>
        <Id>1</Id>
        <Name>Alice</Name>
        <Email>alice@example.com</Email>
      </User>
    </GetUserResponse>
  </soap:Body>
</soap:Envelope>

REST обычно на 30-50% меньше по размеру.

3. Кэширование

REST - легко кэшировать:

GET /api/users/1  # HTTP кэширование работает автоматически
Cache-Control: max-age=3600

SOAP - сложно кэшировать:

POST /soap  # Всё идет через POST, стандартное кэширование не работает

4. Безопасность

REST:

# Использует HTTPS и стандартные заголовки
Authorization: Bearer <JWT token>

SOAP:

<soap:Header>
  <Security xmlns="...">
    <UsernameToken>
      <Username>alice</Username>
      <Password>secret</Password>
    </UsernameToken>
  </Security>
</soap:Header>

Когда использовать REST

REST подходит для:

  • Публичных API и веб-сервисов
  • Мобильных приложений
  • Микросервисов
  • RESTful архитектур
  • Когда нужна простота
# Пример REST API для мобильного приложения
@app.get("/api/v1/posts")
def get_posts(skip: int = 0, limit: int = 10):
    return posts[skip:skip+limit]

@app.post("/api/v1/posts")
def create_post(post: PostCreate):
    # Просто, быстро, понятно
    pass

Когда использовать SOAP

SOAP всё еще используется:

  • Legacy системы (банки, страховки)
  • Когда нужна строгая типизация
  • Когда нужна сложная сигнатура
  • Когда требуется ACID и надежность
# SOAP - более формальный контракт
# Генерируется из WSDL
from zeep import Client

client = Client(wsdl='http://example.com/soap?wsdl')
response = client.service.GetUser(UserId=1)

История

1999  → SOAP создан (XML-RPC)
2000s → SOAP популярен (веб-сервисы)
2010  → REST становится популярнее
2020+ → REST доминирует (JSON API, GraphQL)

SOAP:

  • Был стандартом для Enterprise integration
  • Требовал строгих контрактов
  • Медленнее из-за XML

REST:

  • Стал стандартом для веб-приложений
  • Гибче и проще
  • Работает с JSON (быстрее)

Вывод

REST - это архитектурный стиль, который сегодня доминирует:

  • Простой и интуитивный
  • Использует стандартные HTTP методы
  • Легко кэшировать и масштабировать
  • Работает отлично с JSON
  • Идеален для современных API

SOAP - это протокол, который был главным 20 лет назад:

  • Сложный, но формальный
  • Строгая типизация через WSDL
  • Медленнее из-за XML
  • Используется в legacy системах (банки, страховки)

Для новых проектов используй REST. SOAP нужна только для интеграции со старыми системами.