для - Должны ли веб-службы Netflix или Twitter использовать REST или SOAP?




чайников протокол (5)

SOAP - это объектно-ориентированный , удаленный стек технологий процедур . Он работает, создавая новую абстракцию поверх существующего протокола (HTTP).

REST - это ориентированный на документ подход, который просто использует функции существующего протокола (HTTP). «REST» - просто модное слово - концепция такова: просто используйте Интернет так, как он был разработан для работы!

В ответ на вопрос:

  1. «Реализация услуги REST длится бесконечно дольше, чем реализация SOAP-сервиса».

    Нет, это не может быть бесконечно длиннее. И в тех случаях, когда то, что вы пытаетесь получить, уже является документом или файлом , это на самом деле намного быстрее . Например, спецификация OGC для WMS (Web Mapping Service) определяет как SOAP, так и REST версию протокола, и есть причина, по которой почти никто не реализует SOAP-версию, потому что, если вы пытаетесь получить карту, это намного проще просто создать URL-адрес и получить изображения байтов из этого URL-адреса, чем это нужно для инкапсуляции в сообщение SOAP. Но да, я соглашусь, что если точкой веб-службы является передача некоторого сильно типизированного объекта в объектной модели домена, SOAP лучше подходит для этого использования.

  2. «Зачем писать службу REST, которая в любом случае возвращает XML?»

    Да, это может быть глупо. Но это зависит от того, что такое XML. Если в нем есть четко определенная схема, то нет никакой двусмысленности. Например, вы можете думать, что URL-адреса WSDL являются своего рода веб-службой RESTful для получения информации о веб-службе. В этом случае добавление служебных данных другого запроса SOAP было бы бессмысленным.

    В общем, REST выигрывает, когда передаваемый контент можно рассматривать как файл как единое целое . SOAP выигрывает, когда контент должен рассматриваться как объект с членами .

  3. «Я слышал жалобу на то, что с SOAP у вас есть« накладные расходы »в конверте SOAP. В этот день и в возрасте нам действительно нужно беспокоиться о нескольких байтах?»

    Да. Не в любых обстоятельствах, но есть сайты с большим количеством трафика, где это имеет значение. Достаточно ли разницы перевесить семантические различия в использовании SOAP вместо REST? Я сомневаюсь в этом. Если вы делаете протокол удаленного доступа к объекту и количество байтов делает разницу, SOAP, вероятно, не является для вас инструментом - возможно, вы должны использовать CORBA или DCOM.

  4. «Я слышал аргумент, что с помощью REST вы можете просто поместить URL-адрес в браузер и посмотреть данные».

    Да, и это большой аргумент в пользу REST, если имеет смысл просматривать данные в браузере . Например, с данными изображения, это простой способ отладки службы - просто вставьте URL-адрес в адресную строку браузера и посмотрите, как выглядит изображение. Или, если возвращаемые данные находятся в XML, и у вас есть ссылка на таблицу стилей XML, которая отображается в читаемом HTML в браузере, тогда вы получаете преимущества семантической разметки и простой визуализации всего в одном пакете. Но вы правы, это преимущество в основном испаряется при работе с более сложными схемами аутентификации. Если вы не можете закодировать всю свою информацию аутентификации в каждом HTTP-запросе , я бы сказал, что она вообще не считается REST.

  5. «Зачем нам нужен« удобочитаемый »URL-адрес для каждого ресурса? Если мы использовали инструмент для реализации службы, действительно ли мы заботимся о фактическом URL-адресе?»

    Смотря как. Почему нам нужны читаемые URL-адреса для любого ресурса в Интернете? Вы можете прочитать эссе Тима Бернерса-Ли « Cool URIs Do not Change для обоснования», но в принципе, пока ресурс может быть полезен в будущем, URI для этого ресурса должен оставаться неизменным.

    Очевидно, что для временных ресурсов (например, ссылки «Сегодняшние деньги» в эссе) нет необходимости в этом, так как необходимость ссылки на ресурс исчезает, если соответствующий ресурс уходит. Но для более постоянных ресурсов (например, вопросов StackOverflow, например, или фильмов в IMDB) вы хотите иметь URL-адрес, который будет работать вечно. Когда вы разрабатываете веб-службу, вам нужно решить, могут ли сами ресурсы пережить вашу услугу, и если да, то REST - это, вероятно, правильный путь.

Для записи, да, я разрабатывал веб-страницы, так как задолго до NetFlix или Twitter существовал. И нет, у меня еще не было никакой потребности или возможности реализовать клиента ни в сервисах NetFlix, ни в Twitter. Но даже если их услуги ужасно трудны в работе, это не значит, что технология, на которой они выполняли свои услуги, плоха - только то, что эти две реализации плохи.

Короче говоря: REST и SOAP - это просто инструменты . У каждого из них есть свои сильные и слабые стороны. Если единственный инструмент у вас есть молот, то каждая проблема выглядит как гвоздь. Поэтому ознакомьтесь с обоими инструментами и научитесь правильно их использовать, а затем выберите подходящий инструмент для каждой работы.

Я реализовал две службы REST: Twitter и Netflix. Оба раза я изо всех сил пытался найти применение и логику, участвующие в решении разоблачить эти службы как REST, а не SOAP. Я надеюсь, что кто-то может понять меня в том, что мне не хватает, и объяснить, почему REST использовался как реализация службы для таких сервисов.

1) Внедрение службы REST длится бесконечно дольше, чем реализация SOAP-сервиса. Инструменты существуют для всех современных языков / фреймворков / платформ для чтения в WSDL и вывода классов и клиентов прокси. Внедрение службы REST выполняется вручную, и - получите это - путем чтения документации. Кроме того, при реализации этих двух сервисов вы должны делать «догадки» относительно того, что будет возвращаться через трубу, поскольку нет реальной схемы или справочного документа.

2) Зачем писать службу REST, которая в любом случае возвращает XML? Единственное различие заключается в том, что с помощью REST вы не знаете типы, которые представляет каждый элемент / атрибут, - вы сами по себе, чтобы реализовать его, и надеетесь, что в один прекрасный день строка не встретится в поле, которое, по вашему мнению, всегда было int. SOAP определяет структуру данных, используя WSDL, поэтому это не требует больших усилий.

3) Я слышал жалобу, что с SOAP у вас есть «накладные расходы» в конверте SOAP. В этот день и возраст, действительно ли нам нужно беспокоиться о нескольких байтах?

4) Я слышал аргумент, что с помощью REST вы можете просто поместить URL-адрес в браузер и посмотреть данные. Конечно, если ваша служба REST использует простую или не аутентификацию. Например, служба Netflix использует OAuth, которая требует, чтобы вы подписали вещи и закодировали вещи, прежде чем вы сможете даже отправить свой запрос.

5) Зачем нам нужен «читаемый» URL для каждого ресурса? Если мы использовали инструмент для реализации службы, действительно ли мы заботимся о фактическом URL?



WSDL и другие протоколы уровня документа являются избыточными. Протокол HTTP поддерживает гораздо более богатый набор операций, помимо всего лишь подачи документов и отправки форм.

Сторонники REST неудобны для этой избыточности.


Честный вопрос заслуживает честного ответа. Но во-первых, почему вы использовали текст этого вопроса в качестве ответа на другой вопрос, если не считаете его риторическим по своей природе?

Так или иначе:

  1. « Инструменты существуют для всех современных языков / фреймворков / платформ для чтения в WSDL и вывода прокси-классов и клиентов. Реализация службы REST выполняется вручную, читая документацию ».

    Подобно тому, как разработчики браузеров прочитали и перечитали спецификацию HTML 4.01 вверх и вниз, чтобы попытаться реализовать последовательный просмотр. Вы размышляли о том, что браузеры были изобретены задолго до интернет-банкинга и , и все же вы можете использовать браузер, чтобы делать именно эти вещи. Это стало возможным благодаря единственной причине, что все согласны использовать HTML (и связанные с ним форматы, такие как CSS, JS, JPEG и т. Д.).

    Ведение блога на самом деле не так уж и ново, и кто-то придумал AtomPub, который позволяет любому программному обеспечению блогов получать и обновлять сообщения в блоге, так же как любой веб-браузер может получить доступ к любой веб-странице. Это довольно аккуратно и работает из-за ограничений RESTful, налагаемых протоколом.

    Но для Twitter и Netflix нет универсального соглашения о том, что «все существующие в мире микроблоги должны использовать приложение / твиттер типа мультимедиа», главным образом потому, что микроблоги являются настолько новыми. Возможно, через несколько лет несколько сервисов микроблогов согласуются с одним и тем же API, чтобы Twitter, Facebook, Identica и могли взаимодействовать. Ни один из их существующих API нигде рядом с RESTful, как бы они ни требовали, поэтому я не ожидаю, что это произойдет в ближайшее время.

    « Кроме того, при реализации этих двух сервисов вы должны сделать« догадки »о том, что произойдет через трубу, поскольку нет реальной схемы или справочного документа ».

    Вы ударили ноготь по голове. REST - все о распределенных и гипермедиях, и это в значительной степени подводит итог. Браузер смотрит на то, что получает от запроса, и показывает его пользователю. HTML-страница обычно генерирует намного больше запросов GET, например CSS, скриптов и изображений. Изображение обычно отображается только на экране, выполняется JavaScript, и так далее. Каждый раз браузер делает то, что он делает, потому что он нашел ссылку в <img> или <style> а типом типа ответа был image/jpeg или text/css .

    Если Twitter делает API на основе гипермедиа, он, вероятно, всегда будет возвращать application/tweet каждый раз, когда вы будете следовать ссылке на твит, но клиент никогда не должен его принимать, и всегда проверяйте, что он делает, прежде чем действовать на нем.

  2. « Зачем писать службу REST, которая в любом случае возвращает XML? »

    Все это сводится к типам СМИ. Как и HTML, если вы видите элемент, который вы не знаете, что на самом деле означает, спецификация HTML указывает вам игнорировать их и обрабатывать «тело» тега, если он есть. Аналогично, спецификация атома указывает вам игнорировать неизвестные элементы и внешнюю разметку (из разных пространств имен), а не обрабатывать тело (IIRC).

    Проектирование типов носителей для общих проблемных областей (как и в виде носителя HTML для проблемного домена с богатым текстом ) очень сложно. Создание типов носителей для очень узких проблемных областей, вероятно, намного проще (например, чириканье). Но всегда рекомендуется разрабатывать расширяемость и определять, как клиенты (и серверы) должны реагировать, когда видят элементы или элементы данных, которые не соответствуют спецификации. JPEG, например, имеет тип записи, специфичный для приложения (например, APP1), который используется для хранения всех видов метаданных.

  3. « Я слышал жалобу на то, что с SOAP у вас есть« накладные расходы »в конверте SOAP. В этот день и в возрасте нам действительно нужно беспокоиться о нескольких байтах? »

    Нет, нет. REST абсолютно не связан с эффективностью работы с проводной сетью, на самом деле это эффективна с точки зрения эффективности проводки. Эффективность REST исходит из возможностей кэширования, разрешенных всеми другими ограничениями: примечания к работе Филдинга : Компромисс заключается в том, что унифицированный интерфейс ухудшается поскольку информация передается в стандартизованной форме, а не в той, которая соответствует потребностям приложения. Интерфейс REST предназначен для эффективной передачи данных гипермедиа с крупными зернами, оптимизации для общего случая Интернета, но в результате чего интерфейс не является оптимальным для других форм взаимодействия с архитектурой. Я не думаю, что подсчет байтов SOAP Envelope считается актуальной проблемой.

  4. « Я слышал аргумент, что с помощью REST вы можете просто поместить URL-адрес в браузер и посмотреть данные ».

    Да, это также неверный аргумент. Это не работает. Даже если это сработало, в большинстве узких API-интерфейсов REST используются типы носителей, о которых браузеры понятия не имеют и все еще не работают.

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

  5. « Зачем нам нужен« удобочитаемый »URL-адрес для каждого ресурса? Если мы использовали инструмент для реализации службы, действительно ли мы заботимся о фактическом URL-адресе? »

    Если вы посмотрите, как работает веб-сайт, я уверен, что люди в целом рады, что URI для страницы wikipedia выглядит так: http://en.wikipedia.org/wiki/Stack_overflow вместо http://en.wikipedia.org/wiki/?oldid=376349090 . Но на самом деле это не важно для REST. Важная вещь, чтобы попытаться получить право - это выбрать размещение соответствующих данных в URI, который вряд ли изменится. Вы можете подумать, что идентификатор базы данных никогда не изменится, но что произойдет, когда два набора данных необходимо объединить? Все первичные ключи меняются. Заголовок страницы (Stack_overflow) не изменится.

Извините за длинный ответ, но я верю, что этот вопрос действителен и до сих пор не обсуждался здесь. Я уверен, что Даррел Миллер добавит свой ответ, как только он вернется.

Изменить: форматирование


В примечании xkcd на веб-сайте Bobby Tables есть полезные советы, чтобы избежать неправильной интерпретации пользовательских данных (в данном случае строки «Null») в SQL-запросах на разных языках, включая ColdFusion .

Из вопроса не ясно, что это источник проблемы, и учитывая решение, указанное в комментарии к первому ответу (вложение параметров в структуру), кажется вероятным, что это было нечто другое.





rest soap