如何解决如何在Xquery的自定义重写器代码中包含Marklogic rest-api?
我是Marklogic中URL重写过程的新手,需要帮助来解决以下问题。
我已经编写了Xquery实现,以将我的API端点重定向为/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")
在App服务器配置中,将 url-rewriter 路径设置为/rewriter-ex/rewriter.xqy,并且在应用程序中将 rewrite全局解析参数设置为true服务器。
我能够将我的API URL重定向到相应的端点。但是我无法使用预定义的ML Res-API端点,例如/ v1 / documents,它显示rewriter.xqy返回的404错误。
有没有一种方法可以实现重写器来支持其余api端点和自定义API端点?
解决方法
如果您想在MarkLogic之上创建自己的RESTful API,并使用自己的自定义端点。请签出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 App Server(位于自己的端口)上,并与另一个具有默认MarkLogic REST API的HTTP App Server并存。
XQRS与MarkLogic的其他软件完全兼容,包括Data Hub Framework,它们可以一起聚会。
,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
希望有帮助,
,感谢您的回答。我正计划使用两个应用程序服务器,其中一个用于其余调用,另一个用于API调用。这两个应用程序服务器将指向同一数据库。请告诉我这是否是正确的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。