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

«В чём разница между SOAP и REST?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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"));