WinHttpRequest gzip 响应解析 [英] WinHttpRequest gzip response parsing
问题描述
我在 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屋!