【问题标题】:Replace XCC calls with Rest Calls in Marklogic在 Marklogic 中将 XCC 调用替换为 Rest 调用
【发布时间】:2018-09-24 10:41:42
【问题描述】:

在一个应用程序中,.Net XCC 用于与 marklogic 模块数据库进行通信以执行模块、函数和即席查询等。 我想用 REST 调用替换相同的 XCC 调用,以便我们可以在 marklogic 9 中运行应用程序,因为 Marklogic 9 中已弃用 .Net XCC。

我已经尝试在 marklogic 中内置 rest api。它只允许执行模块数据库中退出的模块。

是否有任何可用的在线资源或任何可以帮助我们的东西。

任何帮助将不胜感激。

谢谢, ArvindKr

【问题讨论】:

    标签: xquery marklogic marklogic-8 marklogic-9


    【解决方案1】:

    /v1/invoke 用于调用附加到您正在处理的 REST 应用服务器的模块数据库中的模块,还有/v1/eval 允许运行即席查询。

    HTH!

    【讨论】:

    • 感谢 grtjn!我面临的一个问题是主模块中的外部变量是使用命名空间定义的。就像“声明变量 $ns:variable as element() external;”当我通过其余部分传递变量时(即 vars= {"ns:variable"="
      test
      "} )它给出了 XDMP-EXTVAR: declare variable not defined 的错误。
    • @grtjn 完全正确。有关在命名空间中传入外部变量值的示例,请参阅 docs.marklogic.com/guide/rest-dev/extensions#id_13936
    【解决方案2】:

    如果您打算用 RESTful 调用替换 XCC.NET,请尝试 XQRS,它允许您以类似于 Java 的 JAX-RS 的方式在 XQuery 中构建服务。

    【讨论】:

      【解决方案3】:

      我只考虑以下情况,例如您的情况,与遗留代码的兼容性是有用的或需要的,以及其他选项已用尽的情况。这不是一种优雅的方法,但在特殊情况下可能会有用。

      XDBC 协议(这是 XCC 使用的)在与 REST API 公开的完全相同的应用服务器和端口上受到原生支持。您可以在默认安装的端口 8000 上看到这一点。服务器实际上无法区分“REST 应用程序”和“XCC 应用程序”,除非通过请求中请求的 URI(在某些情况下还有额外的标头,如 cookie)。 REST 和 XDBC 都是基于 HTTP 的,并且在 HTTP 层非常相似,它们可以共享相同的端口和配置。 XDBC 通过 XML 重写器“通过”REST 处理。 XDBC 使用 /eval 和 /invoke,而 REST 使用 /v1/eval 和 /vi/invoke。如果您查看端口 8000 的默认 rewriter.xml,您可以看到路由是如何进行的。虽然 XDBC 协议尚未正式发布,但通过查看 XCC 代码(公共 java 源代码)和重写器来“逆向工程”并不难。例如,构造 URL 和有效负载数据来执行基本的 eval 或调用调用并不难。您应该能够通过使用 /eval 和 /invoke 端点准确地复制现有的 XCC.NET 客户端行为(查找 rewriter.xml 中设置的 xdbc 属性,这会导致请求处理使用纯 XDBC 协议和行为。

      如果您无法解决外部变量问题,另一种选择是编写新的“REST 友好”API,然后在旧 APIS 上 xdmp:invoke() 传递适当的命名空间。一种选择是将遗留代码放在完全独立的模块数据库中,然后使用新代码完全复制模块 URI。如果您不需要维护共存版本,则修改旧代码以从参数中删除名称空间或分配局部变量别名。

      【讨论】:

        猜你喜欢
        • 2019-12-01
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多