четверг, 22 мая 2008 г.

Описание REST-сервисов

В отличие от RPC-систем (CORBA и т.д.), методы в REST зафиксированы, их немного и семантика их общеизвестна. Поэтому основной задачей является описание структур данных, отправляемых этим фиксированным методам и получаемых обратно.
В первом приближении можно обойтись просто схемой данных. Для XML это XML Schema (стандарт, наиболее громоздкий вариант), RELAX NG, Schematron и т.п. Для JSON схема пока только формируется сообществом. По аналогии с XML Schema, JSON Schema оформляется на JSON (см. драфт спецификации). Другие примеры схем для JSON:
  • JSONR - интересен генерацией Web-форм с валидацией;
  • Kwalify - схема для формата YAML, частным случаем которого можно считать JSON, интересен наличием валидаторов на Java и Ruby.
Помимо этого есть стандартные форматы данных в Web, так называемые MIME-типы. Другое дело, что для картинки достаточно MIME-типа, а для JSON нужно еще знать схему содержимого.
Вариант с использованием только схемы данных неудобен тем, что за рамками описания остается то, куда (на какой URL) и какому HTTP-методу какие из описанных структур данных отправляются. То есть описание собственно интерфейса REST-сервиса. Есть два подхода к решению этой проблемы.
Первый (пропагандируемый REST-гуру) - использовать любой удобный и понятный всем разработчикам формат для записи этой информации. Этот формат может быть специфичным для определенной прикладной области. В конце концов, если используются все время одни и те же методы по шаблонным URI, то можно один раз оформить спецификацию такого протокола. То же касается и форматов данных. Пример такого подхода - Atom Publishing Protocol (как и по каким URL вызвать методы) + Atom Syndication Format (формат передаваемых данных). См. также эту статью. Кстати, AtomPub это возможно то, что надо для реализации каталога сервисов. Важно подчеркнуть, что AtomPub-клиенты реализуют, только читая спецификации и не прибегая к средствам генерации кода.
Второй подход (как в RPC и "Web"-сервисах на SOAP) - создается декларативный язык описания интерфейсов (Interface Definition Language, IDL) наподобие CORBA IDL и WSDL. После чего из описаний на этом языке специальным компилятором генерируется код для реализации и вызова сервиса на требуемом языке программирования. Этот код повторяет интерфейс сервиса, обеспечивает контроль типов и скрывает внутри манипуляции с форматами данных (сериализацию). При описании параметров IDL может ссылаться на те же схемы данных. Например, WSDL использует XML Schema. Для REST наиболее известной попыткой создать нечто подобное является Web Application Description Language (WADL).
О том, какой из этих двух подходов лучше для REST, - в следующий раз.

Комментариев нет: