Http POST请求将正文返回为base64中编码的json

时间:2019-05-28 06:42:02

标签: http http-post httpresponse exist-db

具有授权的

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数据。

1 个答案:

答案 0 :(得分:1)

如果您知道您的API返回JSON,则只需将其传递给util:binary-to-string(),然后假设您想解析JSON而不是原始文本,就可以处理Base64编码的响应主体。 。

这是示例代码,显示了一些用于处理响应的其他逻辑。一些说明:

  1. 我正在使用一个返回JSON的示例终结点。
  2. 它检查响应以确保200响应;如果不是,它将仅返回状态和消息作为地图。
  3. 它可以处理fn:parse-json()规范中概述的各种响应正文类型。
  4. 它采用了解析JSON的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"