首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从xdmp访问HTTP响应:http-get()

从xdmp访问HTTP响应:http-get()
EN

Stack Overflow用户
提问于 2012-06-08 01:05:53
回答 1查看 1.2K关注 0票数 2

使用MarkLogic通过xdmp:http-get()xdmp:http-post()从web服务中拉入数据,我希望在尝试处理数据之前能够检查返回的标头。在DQ中,我可以这样做:

代码语言:javascript
复制
let $result := xdmp:http-get($query,$options) (: $query and $options are fine, I promise. :)
return $result

我得到的结果是这样的:

代码语言:javascript
复制
<v:results v:warning="more than one node">
       <response>
           <code>200</code>
            <message>OK</message>
            <headers>
              <server>(actual server data was here)</server>
              <date>Thu, 07 Jun 2012 16:53:24 GMT</date>
              <content-type>application/xml;charset=UTF-8</content-type>
              <content-length>2296</content-length>
              <connection>close</connection>
            </headers>
        </response>

然后是实际的响应。问题是我似乎不能通过XPath进入这个response节点。如果我将返回语句更改为return $result/response/code,则会得到空序列。如果我可以在尝试处理返回的实际数据之前检查代码,以确保返回的值为200,这将比使用try-catch块查看数据是否存在以及是否正常要好得多。

因此,如果有人知道如何访问这些响应代码,我希望看到您的解决方案。

根据记录,我已经尝试过xdmp:get-response-code(),但它不需要任何参数,所以我不知道它查看的是什么响应代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-08 03:49:04

你一下子就被两个陷阱吓到了:

namespaces

  • awareness of document nodes的
  • 感知

首先,名称空间。http-get函数的XML输出位于顶级元素所示的名称空间中:

代码语言:javascript
复制
<response xmlns="xdmp:http-get">

要成功访问该名称空间中的元素,需要在绑定到正确名称空间的查询中声明前缀,然后在XPath表达式中使用该前缀。例如:

代码语言:javascript
复制
declare namespace h="xdmp:http-get";
//h:code

现在让我们来讨论一下文档节点。:-)

您试图访问$result,就好像它是一个包含元素的文档节点,但实际上,它是一个由两个根节点组成的序列(因此它们也不是兄弟节点)。第一个(这里您感兴趣的)是一个无父元素的<response>元素--而不是一个包含<response>元素的文档。

这是一个常见的陷阱:知道文档节点何时存在。文档节点在序列化时总是不可见的(这就是问题所在),并且它们总是存在于存储在数据库中的文档中。但是,当您只在XQuery中使用一个裸元素构造器时(如http-get实现所做的那样),您构造的不是文档节点,而是一个没有文档节点父节点的元素节点。

例如,下面的查询将返回空序列,因为它试图获取<foo><foo>子级

代码语言:javascript
复制
declare variable $foo := <foo>bar</foo>;
$foo/foo

另一方面,下面的代码返回<foo>,因为它获取文档节点的<foo>子节点(必须在XQuery中显式构造):

代码语言:javascript
复制
$declare variable $doc := document{ <foo>bar</foo> };
$doc/foo

因此,您必须知道给定函数的API是如何设计的(它是返回一个包含元素的文档,还是只返回一个元素)。

要解决您的问题,请不要试图访问$result/h:response/h:code (它试图获取<response><response>子级)。相反,访问$result/h:code (或者更准确地说是$result[1]/h:code,因为<response>是由http-get函数返回的两个节点序列中的第一个)。

有关文档节点的更多信息,请查看此博客文章系列:http://community.marklogic.com/blog/document-formats-part1

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10936494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档