Ответ 1
Канарейка в угольной шахте.
Я ждал такого вопроса примерно за год. Неизбежно, что этот день придет, и я уверен, что в ближайшие месяцы мы увидим еще много таких вопросов.
Предупреждающие знаки
Вы абсолютно правы, для создания клиентов RESTful требуется больше времени, чем клиенты SOAP. Инструментарий SOAP отнимает много кода шаблона и делает объекты клиентского прокси доступными практически без усилий. С помощью инструмента, такого как Visual Studio и URL-адреса сервера, я могу получить доступ к удаленным объектам произвольной сложности, локально через менее чем пять минут.
Службы, которые возвращают приложение /xml и application/json, настолько раздражают разработчиков-клиентов. Что мы должны делать с этим блоком данных?
К счастью, множество сайтов, предоставляющих услуги REST, также предоставляют множество клиентских библиотек, чтобы мы могли использовать эти библиотеки для доступа к набору строго типизированных объектов. Кажется, неловко, хотя. Если бы они использовали SOAP, мы могли бы сами генерировать коды прокси-классов.
Накладные расходы SOAP, га. Его латентность, которая убивает. Если люди действительно обеспокоены количеством лишних байтов, проходящих через провод, то, возможно, HTTP не является правильным выбором. Вы видели, сколько байтов используется заголовком user-agent?
Да, вы когда-нибудь пробовали использовать веб-браузер в качестве инструмента отладки для чего-либо, кроме HTML и javascript. Поверьте мне, это отстой. Вы можете использовать только два глагола, кеширование постоянно мешает, обработка ошибок поглощает столько информации, что постоянно ищет проклятый favicon.ico. Просто стреляй в меня.
Читаемый URL. Только существительные, не глаголы. Да, это так просто, пока мы выполняем только операции CRUD, и нам нужно только получить доступ к иерархии объектов одним способом. К сожалению, для большинства приложений требуется немного больше функциональности.
Надвигающаяся катастрофа
Есть метрическая лодка разработчиков, которые в настоящее время разрабатывают приложения, которые интегрируются с службами REST, которые находятся в процессе принятия того же набора выводов, которые у вас есть. Им была обещана простота, гибкость, масштабируемость, эволюция и святой грааль, предназначенный для повторного использования. Характеристики самого веб-сайта, как все может пойти не так.
Тем не менее, они находят, что управление версиями является такой же проблемой, но компилятор не помогает обнаруживать проблемы. Письменный клиентский код - это боль, которую нужно поддерживать, когда структуры данных развиваются, а URL-адреса получают рефакторинг. Проектирование API вокруг только существительных и четырех глаголов может быть очень тяжелым, особенно с реестрами RESTful Url, которые сообщают вам, когда вы можете и не можете использовать строки запроса.
Разработчики начнут спрашивать, почему мы тратим наши усилия на поддержку форматов Json и форматов Xml, почему бы не просто сосредоточить наши усилия на одном и сделать это хорошо?
Как все пошло не так.
Скажите, что пошло не так. Мы, как разработчики, позволили отделам маркетинга воспользоваться нашей основной слабостью. Наш вечный поиск серебряной пули ослепил нас реальностью того, что НАХОДИТ на самом деле. Поверхность REST кажется такой простой и простой. Назовите свои ресурсы URL-адресами и используйте GET, PUT, POST и DELETE. Черт, у нас разработчики уже знают, как это сделать, мы работаем с базами данных в течение многих лет, которые имеют таблицы и столбцы и операторы SQL, которые имеют SELECT, INSERT, UPDATE и DELETE. Это должен был быть кусок пирога.
Есть другие части REST, которые обсуждаются некоторыми людьми, такие как самоописание и ограничение гипермедиа, но эти ограничения не так просты, как идентификация ресурсов и единый интерфейс. Казалось бы, сложность, когда желаемая цель - простота.
Эта политая версия REST во многих отношениях была подтверждена в культуре разработчиков. Были созданы серверные рамки, которые поощряли идентификацию ресурсов и единый интерфейс, но не помогли другим ограничениям. Термины начали плавать вокруг дифференциации подходов (HI-REST против LO-REST, Corporate REST и Academic REST, REST против RESTful).
Несколько человек кричат, что если вы не применяете все ограничения, это не REST. Вы не получите выгоды. Нет половины REST. Но эти голоса были названы религиозными фанатиками, которые были расстроены тем, что их драгоценный термин был украден из мрака и стал мейнстримом. Ревнивые люди, которые пытаются сделать звук REST более сложным, чем есть.
REST, этот термин определенно стал основным. Почти каждый основной веб-ресурс, имеющий API, поддерживает "REST". Twitter и Netflix - два очень высокого уровня. Страшно то, что я могу думать только об одном публичном API, который является самоописательным, и есть горстка, которая действительно реализует ограничение гипермедиа. Конечно, некоторые сайты, такие как StackOverflow и Gowalla, поддерживают ссылки в своих ответах, но в их ссылках есть огромные дыры. У StackOverflow API нет корневой страницы. Представьте, насколько успешным был бы веб-сайт, если бы не была домашняя страница для веб-сайта!
Вы были введены в заблуждение Im fear
Если вы сделали это так далеко, короткий ответ на ваш вопрос - это те API (Netflix и Twitter), которые не соответствуют всем ограничениям, и поэтому вы не получите преимуществ, которые должны принести REST apis.
Клиенты REST занимают больше времени, чем SOAP-клиенты, но не привязаны к одному конкретному сервису, поэтому вы должны иметь возможность повторно использовать их через службы. Возьмем классический пример веб-браузера. Сколько услуг может получить доступ к веб-браузеру? Как насчет Feed Reader? Теперь, сколько различных сервисов может получить доступ к среднему клиенту Twitter? Да, только один.
Клиенты REST не должны создаваться для взаимодействия с одной службой, они должны быть созданы для обработки определенных типов носителей, которые могут обслуживаться любой службой. Очевидным вопросом является то, как вы можете создать клиент REST для службы, которая предоставляет приложение /json или application/xml. Ну, вы не можете. То потому что эти форматы совершенно бесполезны для клиента REST. Вы сами это сказали,
вы должны сделать "догадки" относительно того, что вернется через трубу, как нет реальной схемы или ссылки документ
Вы абсолютно правы для таких сервисов, как Twitter. Однако самоописательное ограничение в REST говорит о том, что заголовок типа HTTP-содержимого должен точно описывать содержимое, которое передается по проводу. Доставка приложения /json и application/xml ничего не сообщает о содержании.
Когда дело доходит до определения производительности систем на основе REST, необходимо посмотреть на большую картину. Говоря о байтах огибающей, речь идет о разворачивании цикла при сравнении быстрого сортировки с видом оболочки. Существуют сценарии, в которых SOAP может работать лучше, и есть сценарии, в которых REST может работать лучше. Контекст - это все.
REST выигрывает большую часть своего преимущества в производительности благодаря тому, что он очень гибкий в отношении того, какие типы носителей он поддерживает, и благодаря сложной поддержке кеширования. Для кэширования работать хорошо, хотя почти все ограничения должны соблюдаться.
Ваш последний пункт о читаемых URL-адресах является самым ироничным. Если вы действительно выполняете ограничение гипермедиа, каждый URL-адрес может быть GUID, и клиентский разработчик ничего не потеряет в удобочитаемости.
Тот факт, что URI должен быть непрозрачным для клиента, является одним из самых важных при разработке систем REST. Читаемые URL-адреса удобны для разработчика сервера, а хорошо структурированные URL-адреса упрощают отправку запросов на серверную инфраструктуру, но это детали реализации, которые не должны влиять на разработчиков, потребляющих API.
API Twitter не близок к тому, чтобы быть RESTful, и поэтому вы не можете увидеть какую-либо выгоду от его использования над SOAP. API Netflix намного ближе, но использование универсальных типов носителей демонстрирует, что неспособность придерживаться даже одного ограничения может оказать глубокое влияние на преимущества, получаемые от службы.
Возможно, это не их вина
Я сделал много демпинга на провайдерах услуг, но требуется два танца RESTfully. Служба может следовать за всеми ограничениями религиозно, и клиент все еще может легко отменить все преимущества.
Если клиентские жесткие коды запрашивают доступ к определенным типам ресурсов, это мешает серверу изменять эти URL-адреса. Конструкция любого вида URL-адресов, основанная на неявном знании того, как структура службы создает свои URL-адреса, является нарушением.
Предположение о том, какой тип представления будет возвращен из ссылки, может привести к проблемам. Сделав предположения о содержании представления, основанном на знаниях, которые явно не указаны в заголовках HTTP, определенно будет создавать связь, которая вызовет боль в будущем.
Должны ли они использовать SOAP?
Лично я так не думаю. REST done right позволяет распределенной системе развиваться в долгосрочной перспективе. Если вы создаете распределенные системы, в которых есть компоненты, которые разрабатываются разными людьми и должны длиться в течение многих лет, тогда REST - довольно хороший вариант.