如何在 Xquery 的自定义重写器代码中包含 Marklogic rest-api?
How to include Marklogic rest-api in custom rewriter code in 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")
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并且rewrite全局解析 参数在应用服务器中设置为true。
我能够将我的 API url 重定向到相应的 endpoints.But 我无法使用预定义的 ML Res-API 端点,例如 /v1/documents,显示 rewriter.xqy.
中返回的 404 错误
有没有一种方法可以实现重写器以支持其余 api 端点以及自定义 API 端点?
REST API 不支持自定义或替换在 REST API 服务器初始化期间配置的默认声明式重写器。此外,REST API 没有为 REST API 端点的功能提供 XQuery 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
希望对您有所帮助,
如果您想在 MarkLogic 之上创建自己的 RESTful API,使用您自己的自定义 end-points。请查看 XQuery API for RESTful Services (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 应用服务器上(在它们自己的端口上),并与另一个具有默认 MarkLogic REST API 的 HTTP 应用服务器并存。
XQRS 与 MarkLogic 的其他软件完全兼容,包括 Data Hub Framework,它们可以一起聚会。
感谢您 answers.I 计划使用两个应用服务器,一个用于休息呼叫,另一个用于 API calls.These 两个应用服务器将指向相同的 DB.Please 让我知道这是否是正确的方法。
我是 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")
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并且rewrite全局解析 参数在应用服务器中设置为true。
我能够将我的 API url 重定向到相应的 endpoints.But 我无法使用预定义的 ML Res-API 端点,例如 /v1/documents,显示 rewriter.xqy.
中返回的 404 错误有没有一种方法可以实现重写器以支持其余 api 端点以及自定义 API 端点?
REST API 不支持自定义或替换在 REST API 服务器初始化期间配置的默认声明式重写器。此外,REST API 没有为 REST API 端点的功能提供 XQuery 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
希望对您有所帮助,
如果您想在 MarkLogic 之上创建自己的 RESTful API,使用您自己的自定义 end-points。请查看 XQuery API for RESTful Services (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 应用服务器上(在它们自己的端口上),并与另一个具有默认 MarkLogic REST API 的 HTTP 应用服务器并存。
XQRS 与 MarkLogic 的其他软件完全兼容,包括 Data Hub Framework,它们可以一起聚会。
感谢您 answers.I 计划使用两个应用服务器,一个用于休息呼叫,另一个用于 API calls.These 两个应用服务器将指向相同的 DB.Please 让我知道这是否是正确的方法。