Насколько полезен / важен отдых HATEOAS (уровень зрелости 3)?


Я участвую в проекте, где некоторые старшие члены команды считают, что REST API должен быть совместим с HATEOAS и реализовывать все уровни зрелости Ричардсона (http://martinfowler.com/articles/richardsonMaturityModel.html)!

AFAIK большинство реализаций REST не совместимы с HATEOAS, и должна быть веская причина, по которой больше людей этого не делают. Я могу думать о таких причинах, как дополнительная сложность, отсутствие фреймворков (серверная и клиентская стороны), производительность концерна И...

Что вы думаете? У вас был опыт работы с HATEOAS в реальном мире проекта?

4 77

4 ответа:

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

люди не делают HATEOAS по всем причинам, которые вы предлагаете: это трудно. Это добавляет сложности как на стороне сервера, так и на стороне клиента (если вы действительно хотите извлечь из этого выгоду).

однако, миллиарды людей испытывают преимущества отдыха сегодня. Вы знаете, что такое URL-адрес "checkout" в Amazon? Я не знаю, но я могу проверить каждый день. Этот URL-адрес изменился? Не знаю, мне все равно.

знаете ли вы, заботится? Всем, кто написал на экране царапины Амазонки автоматизированной клиента. Кто-то, кто, вероятно, кропотливо нюхал веб-трафик, читал HTML-страницы и т. д. найти какие ссылки звонить когда и с какими полезными нагрузками.

и как только Amazon изменил свои внутренние процессы и структуру URL, эти жестко закодированные клиенты потерпели неудачу-потому что ссылки сломались.

тем не менее, случайные веб-серферов удалось магазин весь день с трудом заминка.

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

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

Если вы пишете внутренний API для связи между двумя системами с экспертной технической поддержкой и ИТ по обе стороны трафика, которые способны быстро, надежно и с расписанием изменений передавать изменения, то REST ничего вам не покупает. Вам это не нужно, ваше приложение недостаточно велико, и оно недостаточно долго живет, чтобы иметь значение.

большие сайты с большими пользовательскими базами имеют эту проблему. Они нельзя просто попросить людей изменить свой клиентский код по прихоти при взаимодействии с их системами. Расписание разработки серверов не совпадает с расписанием разработки клиентов. Резкие изменения API просто неприемлемы для всех участников, поскольку они нарушают трафик и операции с обеих сторон.

таким образом, такая операция, скорее всего, выиграет от HATEOAS, так как это проще для версии, легче для старых клиентов для миграции, легче быть обратно совместимым, чем не.

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

но большинству людей не нужна такая гибкость. Они пишут серверный код для 2 или 3 отделов, это все внутреннее использование. Если он ломается, они исправляют его, и они учитывают это в своих обычных операциях.

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

большая часть отдыха терпит неудачу в пуле" вам это не понадобится". Пока, конечно, не сделаешь.

Если вам это нужно, то используйте его, и использовать его, как он выложен. Отдых не толкает вещи вперед и назад по HTTP. Это никогда не было, это гораздо более высокий уровень, чем что.

но когда вам нужен отдых, и вы используете отдых, тогда HATEOAS является необходимостью. Это часть пакета, и ключ к тому, что заставляет его работать на всех.

Да, у меня был некоторый опыт работы с гипермедиа в API. Вот некоторые из преимуществ:

  1. Explorable API: Это может показаться тривиальным, но не стоит недооценивать силу исследуемого API. Возможность просматривать данные делает его намного проще для разработчиков клиентов, чтобы построить ментальную модель API и его структуры данных.

  2. эксплуатационной документации: Использование URL-адресов в качестве связей ссылок может указывать разработчикам клиентов на документация.

  3. простая логика клиента: Клиент, который просто следует URL-адресам вместо того, чтобы создавать их сам, должен быть проще в реализации и обслуживании.

  4. сервер становится владельцем URL-структур: Использование гипермедиа удаляет жестко закодированные знания клиента о структурах URL, используемых сервером.

  5. выкл загрузки контента в другие службы: Гипермедиа необходима при выгрузке контента на другие серверы (например, CDN).

  6. управление одной: Гипермедиа помогает управлять версиями API.

  7. несколько реализаций одного и того же сервиса/API: Гипермедиа-это необходимость, когда существует несколько реализаций одного и того же сервиса/API. Например, сервис может быть API блога с ресурсами для добавления сообщений и комментариев. Если служба указана в терминах отношений ссылок вместо жестко закодированных URL-адресов, то та же служба может быть создается несколько раз по разным URL-адресам, размещенным разными компаниями, но все еще доступным через один и тот же четко определенный набор ссылок одним клиентом.

вы можете найти подробное объяснение этих пунктов маркера здесь:http://soabits.blogspot.no/2013/12/selling-benefits-of-hypermedia.html

(здесь есть аналогичный вопрос: https://softwareengineering.stackexchange.com/questions/149124/what-is-the-benefit-of-hypermedia-hateoas где я дал такое же объяснение)

Я думаю, что API можно назвать RESTful, даже если клиентская часть приложения не следует принципам HATEOAS. В большинстве случаев клиент до нарушать HATEOAS для удовлетворения требований юзабилити. Позвольте мне объяснить.

HATEOAS не только ставит ограничение на стороне сервера приложения, но и на стороне клиента. Клиент не должен предполагать, что ресурс имеет определенную структуру за пределами структуры, определенной носителем тип. Сервер должен предложить API, который поддерживает такой клиент.

теперь предположим, что мы добились этого. Клиентская часть приложения теперь очень универсальна, но, скорее всего, пользовательский опыт плох, потому что без знания семантики ресурсов представление ресурсов не может быть адаптировано для отражения этой семантики. Если ресурс "автомобиль" и ресурс " дом " имеют один и тот же тип носителя (например, application/json), то они будут представлены пользователю в таким же образом, например, как таблица свойств (пары имя/значение).

но хорошо, наш API действительно успокаивает.

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

может ли API по-прежнему называться RESTful? Я так думаю. Это не вина API, что один из его клиентов нарушил HATEOAS.

Я советую создавать RESTful API, т. е. API, для которых может быть реализован универсальный клиент в теории, но в большинстве случаев, вам нужно некоторые жестко закодированную информацию о ресурсах в вашем клиенте для удовлетворения требований. Тем не менее, старайтесь как можно меньше жестко кодировать, чтобы уменьшить зависимости между клиентом и сервером.

Я включил раздел о HATEOAS в мой шаблон реализации REST под названием JAREST.

Я использовал HATEOAS в некоторых реальных проектах, но с другой интерпретацией, чем Ричардсон. Если это то, что хотят ваши боссы, то я думаю, вы должны просто сделать это. Я считаю, что HATEOAS означает, что ваши ресурсы должны включать в себя HTML doctype, гиперссылки на связанные ресурсы и HTML-формы для предоставления функциональности для глаголов, отличных от GET. (Это когда тип Accept-text / html - другие типы контента не требуют этих дополнительных функций.) Я не знаю, где вера в то, что все остальные ресурсы все ваше приложение должно быть склеено вместе. Сетевое приложение должно содержать несколько ресурсов, которые могут быть или не быть непосредственно связаны. Или почему считается, что XML, JSON и другие типы должны следовать этому. (HATEOAS является специфичным для HTML.)