VBA中WinHTTP请求超时失败的原因及解决方法
VBA WinHttpRequest 请求超时的解决方案
问题背景
我在使用VBA的WinHttpRequest类向目标HTTP服务器发送GET请求时,遇到了请求还没执行到.Send步骤就直接超时失败的问题。之前用类似的代码对接其他服务器完全正常,这次我已经通过Chrome开发者工具核对了所有请求头,甚至尝试直接复制浏览器的请求(带/不带Cookie)都没有效果。
我的目标是通过这个宏登录网站获取信息并写入Excel工作表,已知目标URL会有跳转,但需要先访问原站点获取Cookie。
我的测试代码
Dim WHTTP As New WinHttp.WinHttpRequest With WHTTP .Open "GET", "https://contactcenter-prd.prosodie.com/prweb/sso", False .SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" .SetRequestHeader "Accept-Encoding", "gzip, deflate, br" .SetRequestHeader "Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7" .SetRequestHeader "Connection", "keep-alive" '.SetRequestHeader "Cookie", "JSESSIONID=337C72E2DBCC1080C674033FFC51EBFA.contactcenter; Pega-RULES=" & Chr(34) & "{atn}e3ByfVkzNDBlc3NYRlBYdWFRT2dkRFRjekU5LytjNm51MEMwazI4YmJqVDNvaFlUTE1LQUN3T1p6SUVYMEd5dlUxaHRSWEVINFpJTWVhY1YKdCtpRkQwZjJLdz09" & Chr(34) & "; BWROUTEID=s2ac70d938fbd5ee39c5b1b93ac33d7b.1" .SetRequestHeader "Host", "contactcenter-prd.prosodie.com" .SetRequestHeader "Upgrade-Insecure-Requests", "1" '.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36" ' From Chrome .SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" ' Some guy said it would work (it didn't) '.SetTimeouts 1200000, 1200000, 1200000, 1200000 .Send End With
解决方法
经过排查,发现问题出在代理设置上!只需要在请求中添加代理配置,使用WinHttpRequest的.SetProxy方法即可解决超时问题:
在.Open之后、.Send之前添加这行代码(替换myProxy为你的实际代理地址,格式如"proxy.example.com:8080"):
.SetProxy 2, myProxy
完整的修正后代码示例:
Dim WHTTP As New WinHttp.WinHttpRequest Dim myProxy As String myProxy = "your-proxy-address:port" ' 替换为实际代理地址和端口 With WHTTP .Open "GET", "https://contactcenter-prd.prosodie.com/prweb/sso", False ' 添加代理配置 .SetProxy 2, myProxy ' 其他请求头设置 .SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" .SetRequestHeader "Accept-Encoding", "gzip, deflate, br" .SetRequestHeader "Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7" .SetRequestHeader "Connection", "keep-alive" .SetRequestHeader "Host", "contactcenter-prd.prosodie.com" .SetRequestHeader "Upgrade-Insecure-Requests", "1" .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36" .Send End With
这里简单解释下.SetProxy的参数:
- 第一个参数
2代表使用指定的代理服务器(对应HTTPREQUEST_PROXYSETTING_PROXY常量的数值) - 第二个参数是你的代理地址和端口,按照
"代理服务器地址:端口号"的格式填写即可
内容的提问来源于stack exchange,提问作者Julio Hintze




