如何在VBScript中获取http响应头

时间:2015-09-18 15:07:11

标签: vbscript header xmlhttprequest

为什么这个.vbs脚本会检索空值?

Option Explicit
On Error Resume Next
Dim h: Set h = CreateObject("MSXML2.XMLHTTP")
h.Open "HEAD", "http://google.com/", False
h.send
Dim GetLocation: Set GetLocation = h.getResponseHeader("Location")
MsgBox GetLocation

2 个答案:

答案 0 :(得分:3)

默认情况下,几乎所有HTTP库都遵循重定向 因此,只要您遵循重定向,就无法获得Location标题,因此您需要停止关注重定向。
我推荐两种不同的解决方案。

#1 实现最终网址是最简单的方法,而不是获得Location标题。

Option Explicit

Dim GetLocation
Const SXH_OPTION_URL = -1

Dim h
Set h = CreateObject("MSXML2.ServerXMLHTTP")
    h.Open "HEAD", "http://google.com/", False 
    h.send
GetLocation = h.getOption(SXH_OPTION_URL) 'final URL even if redirected

MsgBox GetLocation

#2 如果您想确保获得第一个 Location标题(不是重定向链中的最后一个链接),您应该使用WinHttpRequest通过禁用重定向,因此您可以获得标头(如果可用)。

Option Explicit

Dim GetLocation
Const WHR_EnableRedirects = 6

Dim h
Set h = CreateObject("WinHttp.WinHttpRequest.5.1")
    h.Option(WHR_EnableRedirects) = False 'disable redirects
    h.Open "HEAD", "http://google.com/", False
    h.Send
GetLocation = h.GetResponseHeader("Location") 'an error occurs if not exist

MsgBox GetLocation

答案 1 :(得分:1)

不确定为什么没有获得Location HTTP标头,但您可以通过调整代码进行调试

Option Explicit
On Error Resume Next
Dim h: Set h = CreateObject("MSXML2.XMLHTTP")
h.Open "HEAD", "http://google.com/", False
h.send
Dim headers: headers = h.getAllResponseHeaders()
MsgBox headers

示例输出

Date: Fri, 18 Sep 2015 15:33:41 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; p="1"; ma=604800
Transfer-Encoding: chunked

考虑到它不确定是否包含Location,除非服务器从URL重定向。

有用的链接