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"
.
我正在尝试使用 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, andbinary
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"
.