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

Ответ

SOAP (Simple Object Access Protocol) и REST (Representational State Transfer) — это архитектурные стили для построения веб-сервисов, основанные на принципиально разных подходах.

Сравнительная таблица

Аспект SOAP REST (RESTful API)
Протокол Может работать поверх HTTP, SMTP, TCP и др. Использует исключительно HTTP/HTTPS.
Формат данных Только XML. Сообщения оборачиваются в конверт SOAP с заголовком и телом. Любой (JSON, XML, Protobuf, plain text). JSON — де-факто стандарт.
Стандартизация Строгая. Использует WSDL для описания контракта и XSD для схем данных. Опирается на стандарты HTTP (методы, коды состояния, заголовки). Единого формата описания нет (часто используют OpenAPI/Swagger).
Подход Протокол на основе операций (RPC-стиль). Клиент вызывает удалённые методы. Архитектурный стиль на основе ресурсов. Взаимодействие через манипуляцию представлениями ресурсов.
Состояние Может поддерживать состояние через WS-* спецификации (сложно). Без состояния (stateless). Каждый запрос содержит всю необходимую информацию.
Безопасность Встроенная, комплексная (WS-Security, WS-Trust). Опирается на транспорт (HTTPS) и стандарты веба (OAuth 2.0, JWT).
Кэширование Нет встроенной поддержки. Широкие возможности кэширования на основе HTTP-заголовков.

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

  • SOAP: Корпоративные системы, где критичны строгие контракты, безопасность (WS-Security), ACID-транзакции (WS-AtomicTransaction) или интеграция со старыми системами (например, в финансах, телекоме).
  • REST: Публичные API, мобильные и веб-приложения, микросервисы. Выбор по умолчанию благодаря простоте, производительности и удобству работы с JavaScript/JSON.

Пример REST-запроса на C

using var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://api.example.com");

// GET запрос
var userResponse = await httpClient.GetAsync("/users/1");
userResponse.EnsureSuccessStatusCode();
var userJson = await userResponse.Content.ReadAsStringAsync();
// Десериализация userJson в объект User

// POST запрос
var newUser = new { Name = "Bob", Email = "bob@example.com" };
var jsonContent = JsonSerializer.Serialize(newUser);
var postResponse = await httpClient.PostAsync("/users",
    new StringContent(jsonContent, Encoding.UTF8, "application/json"));

Ответ 18+ 🔞

Слушай, давай разберёмся, что за звери такие — SOAP и REST. Это ж два абсолютно разных подхода к созданию веб-сервисов, как чёрное и белое, как водка и сок. Один — старый, строгий и занудный, другой — современный, гибкий и понятный.

Короче, смотри таблицу, чтобы не путать

Что сравниваем SOAP REST (или RESTful API)
Протокол Может ехать на чём угодно: HTTP, SMTP, TCP — ему похуй. Сидит строго на HTTP/HTTPS, как будто приклеенный.
Формат данных Только XML, обёрнутый в свой ёбанный конверт SOAP. Без вариантов. Любой, какой захочешь: JSON, XML, хоть простой текст. Но все нормальные люди используют JSON, конечно.
Стандарты Жёсткие, как у военных. WSDL для контракта, XSD для схем — без этого нихуя не работает. Опирается на стандарты HTTP (методы, коды ответов). Контракт часто описывают через OpenAPI (Swagger), но это не обязательно.
Подход Стиль RPC: ты как будто вызываешь удалённые методы на сервере. Архитектурный стиль на ресурсах: ты работаешь с сущностями (пользователи, заказы) через их представления.
Состояние Теоретически может поддерживать состояние, но это такая жесть с WS-* спецификациями, что проще не лезть. Stateless (без состояния). Каждый запрос самодостаточен и несёт всю нужную информацию.
Безопасность Встроенная, мощная, но овердохуища сложная (WS-Security, WS-Trust). Использует то, что даёт веб: HTTPS, OAuth 2.0, JWT. Проще и привычнее.
Кэширование Встроенной поддержки нет, ебать его в сраку. Полная поддержка на уровне HTTP-заголовков (Cache-Control и прочее). Очень эффективно.

Так когда что брать?

  • SOAP: Если ты в большой, старой корпорации, где всё завязано на строгих контрактах, транзакциях и безумной безопасности. Финансы, телеком — их царство. Там эта сложность иногда оправдана.
  • REST: Для всего остального, блядь. Публичные API, мобильные приложения, веб-приложения, микросервисы. Это сейчас стандарт де-факто, потому что просто, быстро и понятно любому фронтендеру.

Пример REST-запроса на C# (чтобы было совсем ясно)

using var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://api.example.com");

// GET запрос — получить пользователя с id=1
var userResponse = await httpClient.GetAsync("/users/1");
userResponse.EnsureSuccessStatusCode();
var userJson = await userResponse.Content.ReadAsStringAsync();
// Дальше userJson нужно превратить в нормальный объект User

// POST запрос — создать нового пользователя
var newUser = new { Name = "Bob", Email = "bob@example.com" };
var jsonContent = JsonSerializer.Serialize(newUser);
var postResponse = await httpClient.PostAsync("/users",
    new StringContent(jsonContent, Encoding.UTF8, "application/json"));

Вот и вся магия. REST — это как поехать на такси, сказал адрес — тебя довезли. SOAP — это как заполнять кипу бумаг в военкомате, чтобы получить справку. Выбор, в общем-то, очевиден.