【问题标题】:VBA HTTP request to API with JSON body returns empty array (MSXML2.XMLHTTP in Excel)对带有 JSON 正文的 API 的 VBA HTTP 请求返回空数组(Excel 中的 MSXML2.XMLHTTP)
【发布时间】:2020-05-29 18:12:48
【问题描述】:

更新:已解决 --> 请看下面的答案。

更新: 在 Microsoft 文档中,我可以看到,当使用 Async=false 调用 open 方法时,如果“协议堆栈超时”,响应可能不会返回,但是我无法读取超时计时器。 https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms931177%28v%3dmsdn.10%29 不确定是否相关。

我正在尝试通过 VersionOne 查询 API 检索 JSON 响应对象。 当我尝试在 VBA 中读取 responseText 时,我收到一个空数组,但是完全相同的请求会从 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 response headers

这是 URL 和请求 JSON 正文: URL and request body

【问题讨论】:

标签: excel vba api web-scraping xmlhttprequest


【解决方案1】:

解决了终于...

所以我找到了答案。 在重新分析 Postman 响应后,我发现 JSON 响应实际上是作为 gzip 编码响应传递的。这与 MSXML2.XMLHTTP 库根本不兼容。

所以为了解决这个问题,我所做的只是改用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多