發送 HTTP 請求時,首先想到的一般是 Msxml2.XMLHTTP(Microsoft.XMLHTTP 已經不提倡使用了)。
ServerXMLHTTP 為不同 Web 服務器之間的服務器安全 HTTP 訪問提供方法和屬性。您可以使用此對象在不同的 Web 服務器之間交換 XML 數據。
ServerXMLHTTP 隨 Microsoft XML Parser (MSXML) 版本 3.0 或更高版本提供。
由於 XMLHTTP 內部使用 WinInet,所以不支持在服務器端應用程序(例如 Active Server Pages (ASP))、宿主在 COM+ 中的組件,或 Windows 服務中使用 XMLHTTP。
XMLHTTP 為客戶端應用程序而設計,並依賴於基於 Microsoft Win32 Internet (WinInet) 而構建的 URLMon。ServerXMLHTTP 為服務器應用程序而設計,並依賴於新的 HTTP 客戶端堆棧 WinHTTP。ServerXMLHTTP 提供了可靠性和安全性,並且是服務器安全的。
ServerXMLHTTP 推薦用於服務器應用程序,而 XMLHTTP 推薦用於客戶端應用程序。
在大部分情況下,Msxml2.XMLHTTP 能夠很好地完成工作,因為它是有緩存的。比如,我們用 Msxml2.XMLHTTP 發送 HTTP POST 請求模擬登陸了某個網站,它會把登陸時的 Cookie 和 Session 緩存下來,當我們想獲取網站的數據時直接 HTTP GET 就行了,不需要人工發送 Cookie 和 Session。
但是,在有些時候,緩存會給我們造成麻煩。比如我們要寫一個 VBS 腳本暴力破解某個網站的賬號,假設我們已經破解了一個賬號,繼續破解時,由於緩存的關系,網站會認為我們已經登陸了,這樣會干擾我們判斷賬號是否破解成功。也就是說,當成功破解一個賬號后,需要多加幾行代碼登出這個賬號。在這種情況下,就應該使用沒有緩存的 Msxml2.ServerXMLHTTP。
總結一下就是,如果需要緩存,則用 Msxml2.XMLHTTP;否則應該用 Msxml2.ServerXMLHTTP。
簡單的發送Get請求方法
Public Function getWeb(ByVal url As String) As String
On Error GoTo ErrHandle
If Len(url) > 4 And LCase(Left(url, 4)) = "http" Then
Dim x As XMLHTTP
Set x = New XMLHTTP
x.Open "GET", url, False
x.send
getWeb = x.responseText
Else
getWeb = ""
End If
Exit Function
ErrHandle:
getWeb = ""
End Function
下面是可以設定超時時間的請求類
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "serverXMLHTTP_Class"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'///////////////////////CODE BY ENVON,goojjie@163.com//////////////////////////////////////
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Http
Private Sub wait(tt)
Dim t, t1, t2, i
t = tt
If t > 10 Then
t1 = Int(t / 10)
t2 = t - t1 * 10
For i = 1 To t1
Call Sleep(10)
DoEvents
Next i
If t2 > 0 Then Call Sleep(t2)
Else
If t > 0 Then Call Sleep(t)
End If
End Sub
Public Function GetCode(ByVal gUrl As String, pm, Optional gRef, Optional gCok)
On Error Resume Next
If LCase(left(gUrl, 4)) <> "http" Then gUrl = "http://" & gUrl
Http.Open "GET", gUrl, True
If gRef <> "" Then Http.SetRequestHeader "Referer", gRef
If gCok <> "" Then Http.SetRequestHeader "Cookie", gCok
Http.Send
Dim waitTimeOut, secondNumber
waitTimeOut = 0
secondNumber = 30 '超時多少秒
Do
DoEvents
wait 10
waitTimeOut = waitTimeOut + 1
Loop Until (Http.ReadyState = 4 Or waitTimeOut >= 100 * secondNumber)
If Http.ReadyState = 4 Then
GetCode = BytesToBstr(Http.ResponseBody, pm)
Else
GetCode = ""
End If
End Function
Public Function PostData(PostUrl, PostStr, PostCok, PostRef, pm, Optional header)
On Error Resume Next
If LCase(left(PostUrl, 4)) <> "http" Then PostUrl = "http://" & PostUrl
If PostCok = "" Then PostCok = "ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"
PostCok = Replace(PostCok, Chr(32), "%20")
With Http
.Open "POST", PostUrl, True
.SetRequestHeader "Content-Length", Len(PostStr)
.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.SetRequestHeader "Referer", PostRef
.SetRequestHeader "Cookie", PostCok
.Send PostStr
End With
Dim waitTimeOut, secondNumber
waitTimeOut = 0
secondNumber = 30 '超時多少秒
Do
DoEvents
wait 10
waitTimeOut = waitTimeOut + 1
Loop Until (Http.ReadyState = 4 Or waitTimeOut >= 100 * secondNumber)
If Http.ReadyState = 4 Then
PostData = BytesToBstr(Http.ResponseBody, pm)
Else
PostData = ""
End If
header = Http.getAllResponseHeaders()
End Function
Private Function BytesToBstr(body, Cset)
On Error Resume Next
Dim objstream
Set objstream = CreateObject("adodb.stream")
objstream.Type = 1
objstream.mode = 3
objstream.Open
objstream.write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
Set objstream = Nothing
End Function
Private Sub Class_Initialize()
Set Http = CreateObject("Msxml2.XMLHTTP")
End Sub
Private Sub Class_Terminate()
Set Http = Nothing
End Sub
