Msxml2.XMLHTTP 的几个严重问题

供新手入门和老手参考的教程和相关资料,包括中文帮助

Moderators: tmplinshi, arcticir

Post Reply
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Msxml2.XMLHTTP 的几个严重问题

Post by tmplinshi » 19 Sep 2015, 08:46

Msxml2.XMLHTTP 的用法跟 WinHttp.WinHttpRequest.5.1 很相似,但是目前我发现了 3 个严重的问题:
  1. 不能重定向到不同的域名
    举例来说,http://alturl.com/it3jp 这个网址会重定向至 http://example.com/。而用 Msxml2.XMLHTTP 请求这个网址你既得不到返回的网页内容,也得不到返回的 HTTP 头部信息。

    Code: Select all

    req := ComObjCreate("Msxml2.XMLHTTP")
    req.open("GET", "http://alturl.com/it3jp", False)
    req.Send()
    MsgBox, % req.responseText "`n" req.getAllResponseHeaders()
  2. 无法设置 Referer
    req.SetRequestHeader("Referer", "http://example.com/") 没有效果。
  3. 它会缓存网页内容。多次打开同一个网址,每次得到的结果都是跟第一次一样的。

    Code: Select all

    req := ComObjCreate("Msxml2.XMLHTTP")
    Loop, 3 {
    	req.open("GET", "http://tmplinshi.sinaapp.com/test/time.php", False)
    	req.Send()
    	MsgBox, % req.responseText ; 3次获取的时间都一样了
    }
    关于这个问题,我在谷歌里找到了两个解决方法。
    1. 给网址增加一个随机参数

      Code: Select all

      req := ComObjCreate("Msxml2.XMLHTTP")
      Loop, 3 {
      	r := ComObjCreate("Scriptlet.TypeLib").Guid
      	req.open("GET", "http://tmplinshi.sinaapp.com/test/time.php?r=" r, False)
      	req.Send()
      	MsgBox, % req.responseText
      }
    2. 设置缓存的请求头

      Code: Select all

      req := ComObjCreate("Msxml2.XMLHTTP")
      Loop, 3 {
      	req.open("GET", "http://tmplinshi.sinaapp.com/test/time.php", False)
      	req.SetRequestHeader("Pragma", "no-cache")
      	req.SetRequestHeader("Cache-Control", "no-cache")
      	req.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
      	req.Send()
      	MsgBox, % req.responseText
      }

arcticir
Posts: 693
Joined: 17 Nov 2013, 11:32

Re: Msxml2.XMLHTTP 的几个严重问题

Post by arcticir » 19 Sep 2015, 10:55

它有什么优点,是WinHttpRequest.无法实现的呢?

tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: Msxml2.XMLHTTP 的几个严重问题

Post by tmplinshi » 19 Sep 2015, 12:53

  • Msxml2.XMLHTTP 用的是 IE 浏览器的 cookie
  • 自动添加头字段Accept-Encoding: gzip, deflate,并能自动解压。

Post Reply

Return to “教程资料”