Как включить Marklogic rest-api в пользовательский код перезаписи в Xquery?

Я новичок в процессе перезаписи URL-адресов в Marklogic, и мне нужна помощь, чтобы решить следующую проблему.

Я написал реализацию Xquery для перенаправления моих конечных точек API на соответствующие модули Xquery как /rewriter-ex/rewriter.xqy.

xquery version "1.0-ml";

let $url := xdmp:get-request-url()

 return if(fn:matches($url,"/fetchRecord")) then
             fn:replace($url,"/fetchRecord","/lib/fetch-record.xqy$1")
        else if(fn:matches($url,"/saveRecord")) then
             fn:replace($url,"/saveRecord$","/lib/save-record.xqy")
        else (xdmp:set-response-code(404, "Not found"),"/no/such/resource")

И для пути url-rewriter в конфигурации сервера приложений задано значение /rewriter-ex/rewriter.xqy, а для параметра перезапись разрешается глобально на сервере приложений установлено значение true.

Я могу перенаправить свои URL-адреса API на соответствующие конечные точки. Но я не могу использовать предопределенные конечные точки ML Res-API, такие как /v1/documents, он показывает ошибку 404, возвращенную в rewriter.xqy.

Есть ли способ реализовать переписчик для поддержки как конечных точек API для отдыха, так и конечных точек пользовательского API?


person Antony    schedule 14.10.2020    source источник


Ответы (3)


Если вы хотите создать свой собственный RESTful API поверх MarkLogic с вашими собственными конечными точками. Ознакомьтесь с XQuery API для служб RESTful (XQRS).

declare
  %rest:path("/fetchRecord/{$record-id}")
  %rest:GET
function fetch-record($record-id as xs:string) {
  fn:doc($record-id)
};

declare
  %rest:path("/saveRecord/{$record-id}")
  %rest:PUT("{$doc}")
  %xdmp:update
function put-record($record-id as xs:string, $doc as document-node(element())) {
  xdmp:document-insert($record-id, $doc)
};

Ваши модули RESTXQ могут располагаться на своем собственном отдельном HTTP-сервере приложений (на своем собственном порту) и работать бок о бок с другим HTTP-сервером приложений, на котором установлен MarkLogic REST API по умолчанию.

XQRS полностью совместим с остальным программным обеспечением MarkLogic, включая Data Hub Framework, они могут работать вместе.

person Charles Foster    schedule 14.10.2020

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

Вместо этого рекомендуется расширить REST API одним из следующих способов:

  • Предоставление модуля конечной точки в базе данных модулей и указание фактического пути к модулю в базе данных модулей по запросу к серверу REST API для вызова конечной точки без перезаписи, как в http://myhost:8010/the/directory/path/to/my/module.xqy

    Такие конечные точки могут быть конечными точками службы данных. См. https://docs.marklogic.com/guide/java/DataServices.

  • Использование конечной точки /v1/invoke для вызова основного модуля. См. https://docs.marklogic.com/guide/rest-dev/extensions#id_72813

  • Использование расширения службы ресурсов. См. https://docs.marklogic.com/guide/rest-dev/extensions#id_41710

Надеясь, что это поможет,

person ehennum    schedule 14.10.2020

Спасибо за ваши ответы. Я планирую использовать два сервера приложений, один для остальных вызовов, а другой для вызовов API. Эти два сервера приложений будут указывать на одну и ту же базу данных. Пожалуйста, дайте мне знать, правильный ли это подход.

person Antony    schedule 19.10.2020