Marklogic 带有错误处理的REST API扩展PUT

Marklogic 带有错误处理的REST API扩展PUT,marklogic,Marklogic,我想创建一个自定义的PUT-restapi扩展来接受JSON文档,并将它们写入具有固定URI前缀的数据库,并在这样做时使用广泛的错误处理。我还想要某种URI生成器 我读过: 我看到的所有信息都是关于default/v1/documents/API的,其中有一些关于CURL的内容,但没有我看到的PUT扩展的一个示例或描述 我使用Roxy和ML7 JSON: { "firstName":"John" , "lastName":"Doe" } xquery version "1.0-ml"; m

我想创建一个自定义的PUT-restapi扩展来接受JSON文档,并将它们写入具有固定URI前缀的数据库,并在这样做时使用广泛的错误处理。我还想要某种URI生成器

我读过: 我看到的所有信息都是关于default/v1/documents/API的,其中有一些关于CURL的内容,但没有我看到的PUT扩展的一个示例或描述

我使用Roxy和ML7

JSON:

{ "firstName":"John" , "lastName":"Doe" } 
xquery version "1.0-ml";

module namespace ext = "http://marklogic.com/rest-api/resource/put_example";
import module namespace json6 = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare namespace roxy = "http://marklogic.com/roxy";

declare 
%roxy:params()

function ext:put(
                $context as map:map,
                $params  as map:map
                ) as document-node()*  
    {
    <take provided data>
    <check on data>
    <generate uri>
    <check on uri unique>
    <return OK or a specific error>
    };
类似于:

{ "firstName":"John" , "lastName":"Doe" } 
xquery version "1.0-ml";

module namespace ext = "http://marklogic.com/rest-api/resource/put_example";
import module namespace json6 = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare namespace roxy = "http://marklogic.com/roxy";

declare 
%roxy:params()

function ext:put(
                $context as map:map,
                $params  as map:map
                ) as document-node()*  
    {
    <take provided data>
    <check on data>
    <generate uri>
    <check on uri unique>
    <return OK or a specific error>
    };
xquery版本“1.0-ml”;
模块名称空间ext=”http://marklogic.com/rest-api/resource/put_example";
导入模块名称空间json6=”http://marklogic.com/xdmp/json“at”/MarkLogic/json/json.xqy”;
声明命名空间roxy=”http://marklogic.com/roxy";
声明
%罗克西:帕拉姆斯()
函数ext:put(
$context作为映射:映射,
$params作为映射:映射
)作为文档-node()*
{
};

编辑 谢谢@dave cassel

现在我有了这个转变:

xquery version "1.0-ml";
module namespace app = "http://marklogic.com/rest-api/transform/check";

declare namespace roxy = "http://marklogic.com/roxy";

declare function example:transform(
    $context as map:map,
    $params  as map:map,
    $input   as document-node()
                                  ) as document-node()
{
    let $input-types := map:get($context,"input-types")
    let $negotiate :=
        if ($input-types = "application/xml")
        then () (: now what :)
        else fn:error((),"RESTAPI-EXTNERR",
          ("415","Raven","xml",xdmp:quote(<word>no good</word>)))
    return document { "Done"}  (: may return a document node :)
};
xquery版本“1.0-ml”;
模块名称空间应用程序=”http://marklogic.com/rest-api/transform/check";
声明命名空间roxy=”http://marklogic.com/roxy";
声明函数示例:transform(
$context作为映射:映射,
$params作为映射:映射,
$input作为文档-节点()
)作为文档-node()
{
让$input-types:=map:get($context,“input-types”)
让美元谈判:=
if($input types=“application/xml”)
然后()(:现在是什么:)
else fn:错误((),“RESTAPI-EXTNERR”,
(“415”,“Raven”,“xml”,xdmp:quote(不好)))
返回文档{“完成”}(:可以返回文档节点:)
};
是否有CURL命令来测试此转换?
这里的“then”部分怎么办?我是指处理文件的另一个脚本,还是在这里包括插入文档代码,以便此转换取代了扩展名?

我认为您更希望这样做。您将把文档发布(而不是放置)到/v1/documents?directory=/content/&extension=json&transform=verify——假设您已经创建了一个名为“verify”的转换。然后,MarkLogic将负责为您生成唯一的URI

转换可以根据需要执行任何错误检查。转换在文档插入数据库之前运行,因此引发错误将阻止插入

看起来你已经找到了这个,但是为了其他人的利益,Roxy为和提供了脚手架

请注意,即使您发送的是JSON,它也是如何在内部存储的

编辑

回答你问题的后面部分

问:是否有一个CURL命令来测试这个转换? 答:一旦您安装了转换(“ml local deploy modules”with Roxy),您将使用一个CURL命令,比如转换将如何实际使用:POST to/v1/documents?…&transform=check。我喜欢用电脑做那种测试;我相信其他浏览器也有类似的工具

问:这里的“then”部分怎么办?我是指处理文件的另一个脚本,还是在这里包括insert文档代码,这样转换就代替了扩展名? 答:注意“转换通常不应有副作用”下的第一个项目符号。当然也有例外,但请记住,通过发布到/v1/documents,通常的过程是将文档插入到数据库中。变换到位后。因此,如果“then”部分表示文档是好的,只需执行“then$input”。看见您不需要执行插入文档

然而,假设您想做一些更复杂的检查。您可以将输入节点传递给库模块中定义的函数,该函数将以$input作为参数。如果出现错误,您的函数可能会抛出异常,如果发现可纠正的问题,甚至会修改输入文档。转换将返回该函数调用的结果。将该功能放入单独的库模块(您可以正常导入)的好处是,该功能可以更好地隔离以进行测试