WinHttpRequest gzip 响应解析 [英] WinHttpRequest gzip response parsing

查看:28
本文介绍了WinHttpRequest gzip 响应解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using MSXML2.XMLHTTP60 for http surfing in my VBA project. The issue is MSXML2.XMLHTTP60 is limited to four concurrent requests.

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

I'm trying to use WinHttp.WinHttpRequest.5.1 instead, and there is another issue. MSXML2.XMLHTTP60 parses gzip result automatically, but WinHttpRequest.responseText method fails with error:

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

No mapping for the unicode character exists in the target multi-byte code page.

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

How can I parse this result with standard Windows libraries?

代码示例:
MSXML2.XMLHTTP60 限制:

Code examples:
MSXML2.XMLHTTP60 limitation:

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 不支持解压(证明链接:https://msdn.microsoft.com/ru-ru/library/windows/desktop/hh227298(v=vs.85).aspx).
我需要自己解压响应.

Problem is that WinHttp.WinHttpRequest.5.1 does not support decompression (proof link: https://msdn.microsoft.com/ru-ru/library/windows/desktop/hh227298(v=vs.85).aspx).
I need to decompress the response myself.

解压问题示例:

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

我试图做这个技巧但没有成功:

I was trying to do this trick without success:

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

推荐答案

这个答案证实了 omegastripes 发表的评论.

.setRequestHeader "Accept-Encoding", "identity" 是正确答案!

我已经搜索了几天来解码 gzip 压缩的响应,但不知道我们可以告诉服务器不要压缩响应.

I've searched for days for a way to decode the gzipped response, but wasn't aware we could tell the server to not compress the response.

这篇关于WinHttpRequest gzip 响应解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆