eXist-db POST请求给出的响应包含2个项目。第一个是标题,第二个是不可见的。当我将其放在string()函数中时,它将显示为包含json的base64二进制字符串。 Json是API所连接的用于发送授权数据的格式默认类型(可能是唯一的一种)。
我试图检查eXist是否添加了一些标头,但似乎没有错。使用了请求捕获器并获得了该数据:
OST / HTTP/1.1
Host: endpoint.requestcatcher.com
Accept-Encoding: gzip,deflate
Authorization: Basic OWJhMT...
Connection: Keep-Alive
Content-Length: 0
Content-Type: code
Status-Only: false
User-Agent: Apache-HttpClient/4.5.5 (Java/12.0.1)
这是我的功能代码:
declare function auth:get-access-token() {
let $accessTokenResponse :=
hc:send-request(<hc:request method = 'post' href='https://endpoint.requestcatcher.com'>
<hc:header name = 'Authorization' value = 'Basic { $auth:base64credentials }'/>
<hc:header name = 'status-only' value = 'false'/>
</hc:request>)
return $accessTokenResponse
};
实际结果是响应主体包含base64编码的字符串,其中包含json数据。
我想接收最初由API授权端点发送的json数据。
答案 0 :(得分:1)
如果您知道您的API返回JSON,则只需将其传递给util:binary-to-string()
,然后假设您想解析JSON而不是原始文本,就可以处理Base64编码的响应主体。 。
这是示例代码,显示了一些用于处理响应的其他逻辑。一些说明:
fn:parse-json()
规范中概述的各种响应正文类型。代码:
xquery version "3.1";
import module namespace http = "http://expath.org/ns/http-client";
let $url := "https://jsonplaceholder.typicode.com/todos/1"
let $response := http:send-request(<http:request method = "get" href="{$url}"/>)
let $head := $response[1]
let $body := $response[2]
let $media-type := $head/http:body/@media-type => tokenize("; ") => head()
return
if ($head/@status eq "200") then
(: When the response body contains XML or HTML, it is parsed into a document node. :)
if ($body instance of document-node()) then
$body
(: When the media type is text/*, convert the Base64Binary body to string :)
else if (starts-with($media-type, "text/")) then
$body => util:binary-to-string()
(: Parse JSON into XDM :)
else if ($media-type eq "application/json") then
$body => util:binary-to-string() => parse-json()
(: Assume the body is just binary :)
else
$body
else
map {
"status": $head/@status => string(),
"message": $head/@message => string()
}
我的系统上的响应:
map {
"userId": 1.0e0,
"completed": false(),
"title": "delectus aut autem",
"id": 1.0e0
}
解析JSON的好处是您可以查询结果,例如$result?title
将返回"delectus aut autem"
。