Блоги

Навигационные полоски

Liferay 7.1 Hypermedia API

Формально, в Liferay давно существует API для интеграции со сторонними системами. Причем сразу и SOAP и JSON. Круто? Любой кто пробовал использовать это API - скажет что нет. Данное API генерируется автоматически Service Builder-ом и представляет "внутреннюю реализацию" сущностей и работы с ними. С одной стороны - ничего особо не надо делать, чтобы это API появилось (оно генерируется автоматически по методам в сервис-классах), с другой стороны данным API очень неудобно (читай практически невозможно) пользоваться.

И вот в Liferay озаботились данной проблемой, и еще на Liferay DevCon 2017 презентовали новый проект, целью которого была заявлена реализация вменяемого, удобного для использования API. В основу были положены принципы Hypermedia и Shared Vocabularies. За счет использования Hypermedia - мы получаем удобный механизм получения всех данных из одной точки (пример рассмотрим чуть ниже), за счет использования Shared Vocabularies (например на базе schema.org) мы получаем представление данных, независимое от реализации. Объектная можеть Записи Блога будет одинаковой - не зависимо от того, кто является поставщиком этих записей - Liferay или WordPress.

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

INFO  [fileinstall-/opt/liferay71dev/osgi/marketplace][LPKGArtifactInstaller:200] The portal instance needs to be restarted to complete the installation of /opt/liferay71dev/osgi/marketplace/Liferay CE Hypermedia REST APIs - API.lpkg
INFO  [fileinstall-/opt/liferay71dev/osgi/marketplace][LPKGArtifactInstaller:200] The portal instance needs to be restarted to complete the installation of /opt/liferay71dev/osgi/marketplace/Liferay CE Hypermedia REST APIs - Impl.lpkg

Ух как интересно! Поддержка Hypermedia уже есть в реализации.

App Manager даже показал, что действительно поставилась куча бандлов

Но вот что с этим делать дальше?  Поиск по Liferay Hypermedia ничего внятного не дал, кроме тех же презентаций, и ссылки на проект в github - https://github.com/liferay/com-liferay-apio-architect который скорее являлся реализацией какого-то proof of concept. Ни документации, ни исходников, ничего!

Из списка Bundle-ов видно, в частности, что я могу получить список категорий (например) но вот как это сделать? Пришлось продолжить поиски.

Первое, что получилось найти - это исходные коды данных бандлов - они находятся в проекте liferay-portal: https://github.com/liferay/liferay-portal/tree/master/modules/apps/headless-apio. Осталось ответить на вопрос как это вызвать. И вот после долгих копаний удалось таки найти ту ниточку, через которую получилось раскрутить весь клубок. Этой ниточкой оказалась ссылка https://liferay71dev.emdev.ru/o/api/p/web-site (в вашем случае домен будет другой).

Ура! Мы получили список сайтов - причем для каждого сайта мы получили не только базовую информацию о нем, но и ссылки куда идти дальше. Например, для созданного ранее демо-сайта для Liferay Commerce были следующие данные:

{
    "description" : "This is demo site to try commerce functionality",
    "name" : "Commerce Demo",
    "membershipType" : "open",
    "publicUrl" : "https://liferay71dev.emdev.ru/web/commerce-demo",
    "availableLanguages" : [ "ru-RU" ],
    "@type" : [ "WebSite" ],
    "@id" : "https://liferay71dev.emdev.ru:443/o/api/p/web-site/132001",
    "contentSpace" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001",

Ссылка https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001 указывала нам на путь, по которому мы можем получить данные сайта, в виде

"documentsRepository" : "https://liferay71dev.emdev.ru:443/o/api/p/documents-repository/132001",
  "webSite" : "https://liferay71dev.emdev.ru:443/o/api/p/web-site/132001",
  "vocabularies" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/vocabularies",
  "blogPosts" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/blog-posting",
  "keywords" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/keywords",
  "structuredContents" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/structured-contents",
  "contentStructures" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/content-structures"

Отлично - есть ссылка на словари! Вызываем https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001/vocabularies и получаем

{
    "name" : "Commerce",
    "dateCreated" : "2018-11-27T21:01Z",
    "dateModified" : "2018-11-27T21:01Z",
    "availableLanguages" : [ "ru-RU" ],
    "@type" : [ "Vocabulary" ],
    "@id" : "https://liferay71dev.emdev.ru:443/o/api/p/vocabularies/132527",
    "contentSpace" : "https://liferay71dev.emdev.ru:443/o/api/p/content-space/132001",
    "@context" : [ {
      "contentSpace" : {
        "@type" : "@id"
      }
    }, {
      "creator" : {
        "@type" : "@id"
      }
    }, {
      "vocabularyCategories" : {
        "@type" : "@id"
      }
    } ],
    "creator" : "https://liferay71dev.emdev.ru:443/o/api/p/user-account/39553",
    "vocabularyCategories" : "https://liferay71dev.emdev.ru:443/o/api/p/vocabularies/132527/categories"
  }

Отлично - а вот и ссылка на категории - https://liferay71dev.emdev.ru:443/o/api/p/vocabularies/132527/categories - которая дает нам искомый список категорий в данном словаре!

Очень удобно - и важно - что начав с одной точки - мы, как в википедии - видим ссылки по которым можем идти дальше, "в глубь", для получения детальной информации. И пользоваться данным API значительно удобней, чем тем, что генерируется Service Builder-ом!

28.11.2018