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