HTTP-запрос POST возвращает тело в виде json, закодированного в base64 - PullRequest
1 голос
/ 28 мая 2019

eXist-db POST-запрос с авторизацией дает ответ, который содержит 2 элемента. Первые - это заголовки, а второй - невидимые. Когда я помещаю ее в функцию string (), она раскрывается как двоичная строка base64, содержащая json. 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.

Я хотел бы получить данные json, которые первоначально отправлялись конечной точкой авторизации API.

1 Ответ

2 голосов
/ 29 мая 2019

Если вы знаете, что ваш API возвращает JSON, вы можете обработать тело ответа в кодировке Base64, просто передав его в util:binary-to-string() и затем, если вы хотите проанализировать JSON вместо необработанного текста, в fn:parse-json().

Вот пример кода, показывающий некоторую дополнительную логику для обработки ответа.Некоторые замечания:

  1. Я использую пример конечной точки, которая возвращает JSON.
  2. Проверяет ответ, чтобы обеспечить ответ 200;в противном случае он возвращает только состояние и сообщение в виде карты.
  3. Он обрабатывает различные случаи типов тел ответа, как указано в EXPath HTTP Client spec.
  4. Itделает дополнительный шаг с 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".

...