HTTP-запрос VBA к API с телом JSON возвращает пустой массив (MSXML2.XMLHTTP в Excel) - PullRequest
1 голос
/ 24 марта 2019

Обновление: решено -> Смотрите ответ ниже.

Обновление: В документации Microsoft я вижу, что когда метод open вызывается с Async = false, ответ может не возвращаться, если «истекло время ожидания стека протоколов», однако я не смог прочитать таймеры тайм-аута. https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms931177%28v%3dmsdn.10%29 Не совсем уверен, связано это или нет.

Я пытаюсь получить объект ответа JSON через API запросов VersionOne. Когда я пытаюсь прочитать responseText в VBA, я получаю пустой массив, однако точно такой же запрос возвращает правильные данные из PostMan. Я получаю ответ с кодом HTTP 200, но в теле ответа нет данных.

Причина, по которой это делается в VBA и Excel, заключается в том, что данные необходимо анализировать в уже существующей модели Excel. Я пробовал разные варианты аутентификации, как OAUTH, так и Basic.

Это код VBA

Option Explicit
Sub Test_LateBinding()

    Dim objRequest As Object
    Dim strUrl As String
    Dim strResponse As String
    Dim body As String
    Dim strResponseHeaders As String
    Dim allResponseHeader As String

    Set objRequest = CreateObject("MSXML2.XMLHTTP")
    strUrl = "https://endpoint"
    body = " { ""from"": ""Epic"",""select"": []}"    
    'with basic'
    With objRequest
        .Open "GET", strUrl, False, "XXXX", "XXXX"
        .SetRequestHeader "Content-Type", "application/json"
        .Send body
        strResponseHeaders = .StatusText
        strResponse = .ResponseText
        allResponseHeader = .GetAllResponseHeaders
    End With
    Debug.Print body
    Debug.Print allResponseHeader
    Debug.Print strResponse

End Sub

Это вывод моей консоли:

OK
Content-Type: application/json; charset=utf-8
Content-Length: 2
X-Content-Type-Options: nosniff
V1-MemberID: skatteministeriet/120267
Strict-Transport-Security: max-age=31536000; includeSubdomains
X-Robots-Tag: noindex
VersionOne: Ultimate/19.0.3.29; 0
X-Instart-Request-ID: 3912039762705832388:SEN01-NPPRY25:1553377406:0

[]

Это заголовки ответа PostMan : Заголовки ответов PostMan

Это URL и тело запроса JSON: URL и тело запроса

1 Ответ

0 голосов
/ 28 марта 2019

решено наконец ...

Итак, я нашел ответ. После повторного анализа ответа Почтальона я обнаружил, что ответ JSON фактически был передан как кодированный gzip-ответ. Что просто не совместимо с MSXML2.XMLHTTP lib.

Таким образом, чтобы решить эту проблему, все, что я сделал, это вместо этого использовал библиотеку WinHttp.WinHttpRequest.5.1, которая в принципе новее. Никаких других изменений в коде не требовалось.

Так что для других, использующих MSXML2.XMLHTTP или библиотеку WinHTTPserver.6.0, перейдите на более новую библиотеку:)


Option Explicit
Sub Test_LateBinding()

    Dim objRequest As Object
    Dim strUrl As String
    Dim strResponse As String
    Dim body As String
    Dim strResponseHeaders As String
    Dim allResponseHeader As String

    Set objRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
    strUrl = "https://endpoint"
    body = " { ""from"": ""Epic"",""select"": []}"    
    'with basic'
    With objRequest
        .Open "GET", strUrl, False, "XXXX", "XXXX"
        .SetRequestHeader "Content-Type", "application/json"
        .Send body
        strResponseHeaders = .StatusText
        strResponse = .ResponseText
        allResponseHeader = .GetAllResponseHeaders
    End With
    Debug.Print body
    Debug.Print allResponseHeader
    Debug.Print strResponse

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...