从 MarkLogic 8 中的 rest 端点调用具有依赖关系的 xquery 库

Calling xquery libraries with dependencies from rest endpoints in MarkLogic 8

我们正在从 MarkLogic 6 升级到 8,在调用库模块时遇到了一些问题 运行。我们有从自定义 REST 扩展和非 REST xquery 调用的 xquery 库模块。

MarkLogic 的 documentation 说 REST 端点可以使用通过新的 /ext 端点安装的库或以旧方式安装的库(放置在模块数据库中的其他位置)。但是,当库模块在使用例如MarkLogic自带的functx包时,我无法让交叉工作。

假设我有两个相同的库模块,一个是通过 /ext 安装的,一个不是:

xquery version "1.0-ml";
module namespace test = "test/lib";
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";
declare function test:stuff() { 
    <foo/>
};

第一个是使用此命令安装的,以防万一:

curl --anyauth --user user:pwd -X PUT -i -d @".\module\testlib-ext.xqy" -H "Content-type: application/xquery" "http://host:8020/v1/ext/test/testlib-ext.xqy?perm:rest-reader=execute"

我有使用每个模块的其余端点(唯一的区别是命名空间和导入):

xquery version "1.0-ml";
module namespace te = "http://marklogic.com/rest-api/resource/test-ext-to-ext";
import module namespace test = "test/lib" at "/ext/test/testlib-ext.xqy";
declare function te:get($context as map:map, $params as map:map) as document-node()* {
    document { test:stuff() }
};

使用 /ext 安装的库的方法有效。使用简单地放置在模块数据库中的模块的模块安装没有错误,但在非管理员用户调用时给我一个错误(在管理员调用时它有效):

RESTAPI-INVALIDREQ: (err:FOER0000) Invalid request:  reason: Extension test-ext-to-lib does not exist.

我只是使用 /ext 来安装它们,但是使用 xdmp:invoke 的 xquery 会中断。这是一个不同的错误,但它似乎是相同的潜在问题。使用放置在模块数据库中的库调用模块是可行的。使用通过 /ext 安装的库调用模块失败并出现此错误:

XDMP-MODNOTFOUND: (err:XQST0059) xdmp:invoke("/test/test-module-to-ext.xqy", (), ()) -- Module C:\Program Files\MarkLogic\Modules\MarkLogic\functx\functx-1.0-nodoc-2007-01.xqy not found

如果我将 admin 角色添加到调用用户,所有这些角色都有效。如果我取出 functx 导入,即使没有管理员角色,它们也能工作。

这看起来像是权限问题,但我找不到可以解决它的角色或权限。用户具有每个复选框的角色,除了管理员本身被选中。检查最后一个复选框是我发现的唯一使这项工作有效的方法,这显然不是一个可行的解决方案。

我们并不关心这些库是如何安装的,但我们不想重复代码。我们如何使这些导入与 REST 和非 REST xquery 一起工作?

要使权限生效,依赖链中的主模块和每个库必须至少可由分配给用户的一个角色执行(其中分配包括继承和扩展)。

REST API 在其安装在 /ext 下的模块上设置 rest-extension-user 角色。

因此,具有 rest-extension-user 角色的用户应该能够调用 /ext 下的 REST API 安装的模块。

更一般地说,任何可由 rest-extension-user 角色执行的模块(无论它是如何安装的)都应该能够依赖于 [=11] 下的 REST API 安装的库=](当然,假设所有路径都是正确的)。