REST vs. SOAP/WS-*

На сегодняшний день одним из важнейших направлений в области разработки ПО является направление (веб)-сервисов. Сервисы позволяют строить большие распределенные системы. При этом подходов к построению сервисов сегодня как минимум два - SOAP и REST.

Оба подхода решают схожие задачи - задачи построения распределенных систем. Но делают это по-разному.

SOAP

В случае с SOAP/WS-* фактически мы имеем дело с выполнением операций на удаленном хосте. Обмениваясь SOAP-сообщениями, клиент фактически "просит" сервера выполнить ту или иную операцию, передавая ему при этом параметры (если это необходимо). В ответ на это, сервер отправляет клиенту SOAP-сообщение, в котором содержится - либо отметка об успешном выполнении операции и результат, либо сообщение об ошибке.

Кроме того, передавать SOAP-сообщения можно потенциально через любой транспорт (WCF, например, умеет это делать поверх http, tcp, named pipes, msmq, ...).

В итоге, SOAP-ориентированный подход фактически подталкивает нас к ориентации на операции.

Стоит отметить, что сегодня подавляющее большинство программных продуктов, ориентированных на сервисы используют SOAP в качестве основы.

REST

Подход в стиле REST отличается от SOAP тем, что такой сервис ориентирует нас на работу с данными. Предоставив REST-сервис, мы фактически публикуем данные (коллекции) в Веб.

REST обладает следующими отличительными чертами:

  1. REST-сервисы строятся исключительно поверх HTTP/HTTPS. Это объясняется тем, что REST хорошо использует все тонкие стороны протокола HTTP - HTTP-методы используются для манипулирования информацией (GET, POST, PUT, DELETE), а данные передаются в теле HTTP-сообщений.
  2. REST использует свои правила для формирования URI. Каждый ресурс (коллекция, сущность, поле сущности) внутри сервиса может быть адресован при помощи URI.
  3. Данные могут быть представлены в различном виде (AtomPub, JSON, ..)

Кроме того, отмечу что REST-сервисы не выходят за рамки HTTP, а это означает, что мы можем использовать все наработанные алогритмы в области веб-приложений - кэширование, сжатие трафика, аутентификация и т.д.

И итоге, REST-ориентированный подход подталкивает нас к ориентации на данные.

Разница между REST и SOAP достаточно очевидная и очень важно понимать значение того и другого подхода и использовать каждый из них по назначению. :) Как показывает моя практика общения с различными разработчиками, такое понимание есть далеко не у всех.

Давайте посмотрим пару примеров, чтобы понять какой подход выбрать в конкретной ситуации на практике.

Несколько примеров

Пример 1. Мы хотим разработать серивс-ориентированное приложение для работы с банковским счетом. В сервисе будут 2 бизнес-операции: получить текущий остаток на счету и списать денежные средства. При этом для выполнения операции списания мы должны обратится к локальной СУБД под управлением Microsoft SQL Server, продублировать эту же операцию на мэйнфрейме и отправить уведомление на дублирующий сервер по протоколу TCP. Этот пример ярко демонстрирует ориентацию на операции: для того чтобы списать сумму со счета необходимо выполнить целую цепочку действий. Понятно, что для такого сервиса мы выберем сервисы на базе SOAP.

Пример 2. У нас есть существующая B2C (business to customers) система - веб-приложение, которым пользуются наши любимые клиенты. И тут мы понимаем, что клиентам было бы гораздо удобнее размещать свои каталоги в нашей системе используя настольное приложение, а не веб. Принимается решение создать веб-сервис, через который настольное приложение будет работать с источником данных. Если посмотреть на данный веб-сервис, то мы понимаем, что все что он делает - работает с данными: добавить позицию, редактировать позицию, удалить позицию и получить список всех позиций. Реализация SOAP-сервиса в данном случае избыточна (нам не требуется выполнять бизнес-операции). Для решения задачи идеально подходит решение на базе REST - на сервере мы просто получаем от источника данные, публикуем их в веб и отдаем клиенту URI. Никаких нудных реализаций AddItem(..), UpdateItem(..) и т.д.

Релизация

Ну и напоследок о технологиях. Решения на базе SOAP/WS-* позволяют реализовывать множество технологий - ASP.NET Web Services, WSE и конечно WCF.

Решения на базе REST можно удобно построить на базе ADO.NET Data Services (т.н. Project Astoria). Кроме того, для кого-то наверное окажется новостью, но WCF также умеет строить REST-style сервисы, но об этом позже.