eXist-db 使用 eXPath Http_module 通过 POST 请求发送 JSON

eXist-db send JSON via POST request using eXPath Http_module

我正在尝试使用 eXPath HTTP 模块通过来自 eXist-db 的 POST 请求将 JSON 发送到 API,但我总是收到以下错误:

exerr:ERROR Error serializing the body content 

我的 XQuery 看起来像:

xquery version "3.1";

declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";

let $payload := map {
    "name": "testuser",
    "role": "user"
  }


return

hc:send-request(
  <hc:request method='post'>
    <hc:body media-type="application/json"/>
  </hc:request>,
  'https://reqres.in/api/users',
  serialize($payload, <output:serialization-parameters>
            <output:method>json</output:method>
        </output:serialization-parameters>)
)[2] => util:base64-decode() => parse-json()

预期输出(通过 Postman 测试):

{
    "name": "testuser",
    "id": "820",
    "createdAt": "2021-06-03T05:50:32.049Z"
}

如何将内容序列化为 JSON 并通过来自 eXist-db 的 POST 请求发送?提示 here 的解决方案对我不起作用。

解决方法是在<body>元素中添加@method="text"

此属性记录在 EXPath HTTP 客户端规范的 3.2 Serializing the request content 部分:

The default value of the serialization method depends on the media-type: it is xml if it is an XML media type, html if it is an HTML media type, xhtml if it is application/xhtml+xml, text if it is a textual media type, and binary for any other case.

这意味着 EXPath HTTP 客户端没有 application/json 媒体类型的内置映射——即,它依赖于 binary。但是 JSON 文本媒体类型,并且您已经通过 fn:serialize() 函数将 XDM 映射序列化为文本。因此,您必须覆盖 method="binary" 的 EXPath HTTP 客户端默认值并在 <body> 元素上设置 method="text"

draft v2 spec,简化发送JSON;默认情况下,当它检测到正文包含 map()array() 时,它会将项目序列化为 JSON,并使用适当的媒体类型。

但是现在对于 v1,我们仍然需要明确地 (1) 使用 JSON 序列化方法序列化映射和数组,以及 (2) 在 <body> 元素上指定 method="text" .