XMLHTTP 是客户端模拟浏览器操作的一个对象,下面是通过示例表示使用方法
Set xmlHttp = CreateObject("Msxml2.ServerXMLHTTP")
xmlHttp.open "POST","http://domain/login.asp",False 'POST方法用同步方式打开链接,同步是指等待服务器返回全部内容后再进行下一步
xmlHttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded" 'POST提交表单前需要加这段
xmlHttp.send "user=" & user &"&password=" & password '提交参数,如果参数里有中文,必须首先把中文转换成URL编码
xmlHttp.open "GET","http://domain/logout.asp",False 'GET方法打开链接
xmlHttp.send
status = xmlHttp.status 'xmlHttp.status为返回代码
content = bytes2BSTR(xmlHttp.responseBody) '返回的内容
Set xmlHttp = Nothing
-------------------------------------------------------
注意:
xmlhttp会缓存页面内容,当向同一个URL多次提交数据时,浏览器可能会不向服务器发送信息,直接返回缓存中的内容,导致某些问题
可以在URL后面随便加一个参数避免缓存问题
如
xmlHttp.open "POST","http://domain/login.asp?"&radomvalue,False 'radomvalue设置为一个随机的值
也可以在open方法之后设置
xmlhttp.setRequestHeader "If-Modified-Since", "0"
这样也可以避免缓存,而且不必修改请求的链接
xmlHttp的超时时间默认为1小时,如果要打开的服务器响应很慢,会等待很长时间,持续占用很高的CPU,可以用setTimeouts来设置
这个方法Msxml2.ServerXMLHTTP有但Msxml2.XMLHTTP没有,设置方法如下
xmlHttp.setTimeouts resolveTimeout,connectTimeout,sendTimeout,receiveTimeout
resolveTimeout = 3000 '解析DNS名字的超时时间,3秒
connectTimeout = 3000 '建立Winsock连接的超时时间,3秒
sendTimeout = 3000 '发送数据的超时时间,3秒
receiveTimeout = 10000 '接收response的超时时间,10秒
-------------------------------------------------------
Function bytes2BSTR(vIn) '二进制转字符
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function
Public Function URLEncode(strURL) '中文URL编码
Dim I
Dim tempStr
For I = 1 To Len(strURL)
If Asc(Mid(strURL, I, 1)) < 0 Then
tempStr = "%" & Right(CStr(Hex(Asc(Mid(strURL, I, 1)))), 2)
tempStr = "%" & Left(CStr(Hex(Asc(Mid(strURL, I, 1)))), Len(CStr(Hex(Asc(Mid(strURL, I, 1))))) - 2) & tempStr
URLEncode = URLEncode & tempStr
ElseIf (Asc(Mid(strURL, I, 1)) >= 65 And Asc(Mid(strURL, I, 1)) <= 90) Or (Asc(Mid(strURL, I, 1)) >= 97 And Asc(Mid(strURL, I, 1)) <= 122) Then
URLEncode = URLEncode & Mid(strURL, I, 1)
Else
URLEncode = URLEncode & "%" & Hex(Asc(Mid(strURL, I, 1)))
End If
Next
End Function
Public Function URLDecode(strURL) '中文URL解码
Dim I
If InStr(strURL, "%") = 0 Then URLDecode = strURL: Exit Function
For I = 1 To Len(strURL)
If Mid(strURL, I, 1) = "%" Then
If eval("&H" & Mid(strURL, I + 1, 2)) > 127 Then
URLDecode = URLDecode & Chr(eval("&H" & Mid(strURL, I + 1, 2) & Mid(strURL, I + 4, 2)))
I = I + 5
Else
URLDecode = URLDecode & Chr(eval("&H" & Mid(strURL, I + 1, 2)))
I = I + 2
End If
Else
URLDecode = URLDecode & Mid(strURL, I, 1)
End If