Vba WinHttpRequest gzip响应解析

Vba WinHttpRequest gzip响应解析,vba,web-scraping,xmlhttprequest,winhttp,Vba,Web Scraping,Xmlhttprequest,Winhttp,我在VBA项目中使用MSXML2.XMLHTTP60进行http冲浪。问题是MSXML2。XMLHTTP60被限制为四个并发请求 我正在尝试使用WinHttp.WinHttpRequest.5.1,但还有另一个问题MSXML2.XMLHTTP60自动解析gzip结果,但 WinHttpRequest.responseText方法失败,出现错误: 目标多字节代码页中不存在unicode字符的映射 如何使用标准Windows库解析此结果 代码示例: MSXML2.XMLHTTP60限制: Publi

我在VBA项目中使用
MSXML2.XMLHTTP60
进行http冲浪。问题是
MSXML2。XMLHTTP60
被限制为四个并发请求

我正在尝试使用
WinHttp.WinHttpRequest.5.1
,但还有另一个问题
MSXML2.XMLHTTP60
自动解析gzip结果,但
WinHttpRequest.responseText
方法失败,出现错误:

目标多字节代码页中不存在unicode字符的映射

如何使用标准Windows库解析此结果

代码示例:
MSXML2.XMLHTTP60限制:

Public req1 As MSXML2.XMLHTTP60
Public req2 As MSXML2.XMLHTTP60
Public req3 As MSXML2.XMLHTTP60
Public req4 As MSXML2.XMLHTTP60
Public req5 As MSXML2.XMLHTTP60

Private Const url As String = "http://speedtest.tele2.net/100MB.zip"


Public Sub ConcurrentIssue()
    Set req1 = New MSXML2.XMLHTTP60
    req1.Open "get", url, True

    Set req2 = New MSXML2.XMLHTTP60
    req2.Open "get", url, True

    Set req3 = New MSXML2.XMLHTTP60
    req3.Open "get", url, True

    Set req4 = New MSXML2.XMLHTTP60
    req4.Open "get", url, True

    Set req5 = New MSXML2.XMLHTTP60
    req5.Open "get", url, True

    req1.send
    req2.send
    req3.send
    req4.send

    'This query will be wait
    req5.send

End Sub
问题是
WinHttp.WinHttpRequest.5.1
不支持解压缩(验证链接:)。
我需要自己解压回应

解压问题示例:

Public Sub DecompressOk()
    Set req1 = New MSXML2.XMLHTTP60
    req1.Open "get", "http://www.google.ru", False
    req1.setRequestHeader "User-Agent", "Fiddler"
    req1.setRequestHeader "Accept-Encoding", "gzip, deflate"
    req1.send

    Debug.Print req1.responseText
End Sub

Public Sub WithoutDecompress()
    Dim req As WinHttp.WinHttpRequest
    Set req = New WinHttp.WinHttpRequest

    req.Open "get", "http://www.google.ru", False
    req.setRequestHeader "User-Agent", "Fiddler"
    req.setRequestHeader "Accept-Encoding", "gzip, deflate"
    req.send

    Debug.Print req.responseText
End Sub
我试图做这个把戏却没有成功:

Public Sub DecompressIssue()
    Dim req As WinHttp.WinHttpRequest
    Set req = New WinHttp.WinHttpRequest

    req.Open "get", "http://www.google.ru", False
    req.setRequestHeader "User-Agent", "Fiddler"
    req.setRequestHeader "Accept-Encoding", "gzip, deflate"
    req.send

    SaveBinaryToFile req.responseBody, "C:\test.zip"

    Dim xmlReq As MSXML2.XMLHTTP60
    Set xmlReq = New MSXML2.XMLHTTP60

    xmlReq.Open "get", "C:\test.zip", False
    xmlReq.setRequestHeader "Accept-Encoding", "gzip, deflate"
    xmlReq.setRequestHeader "Content-Type", "text/html; charset=windows-1251"
    xmlReq.send

    Debug.Print xmlReq.responseBody
End Sub

Sub SaveBinaryToFile(arrBytes() As Byte, strPath As String)
    With CreateObject("ADODB.Stream")
        .Type = 1 ' adTypeBinary
        .Open
        .Write arrBytes
        .SaveToFile strPath, 2 ' adSaveCreateOverWrite
        .Close
    End With
End Sub
这个答案证实了这一点

.setRequestHeader“接受编码”,“标识”
是正确答案


我已经搜索了好几天,寻找解码gzip响应的方法,但不知道我们可以告诉服务器不要压缩响应。

请编辑并添加最少的代码。问题应该是,其他人可以重现4个并发请求的问题
MSXML2.XMLHTTP60
限制和
WinHttp.WinHttpRequest.5.1
的“无映射”错误。某些网页可能包含不可读字符,请尝试从
WinHttpRequest.responseBody
获取二进制内容,然后通过
ADODB.Sream
将其转换为文本,如中所示。尝试使用
.setRequestHeader“接受编码”、“标识”
创建XHR,以强制Web服务器发送未压缩的响应。我正试图这样做,但服务器冻结。我不能影响它。