XMLHTTP應用參考
一、使用步驟:
1、創建XMLHTTP對象 //需MSXML4.0支持
2、打開與服務端的連接,同時定義指令發送方式,服務網頁(URL)和請求權限等。客戶端通過Open命令打開與服務端的服務網頁的連接。與普通HTTP指令傳送一樣,可以用"GET"方法或"POST"方法指向服務端的服務網頁。
3、發送指令。
4、等待並接收服務端返回的處理結果。
5、釋放XMLHTTP對象
二、XMLHTTP方法:
1、XMLHTTP對象
備注:客戶機可以使用XMLHTTP對象發送任意的HTTP請求,接受HTTP應答,還可以對應答的XML文檔進行解析。
Open方法:初始化一個Msxml2.XMLHTTP請求,指定HTTP請求方式、URL以及鑒定信息。
Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )
bstrMethod: 數據傳送方式,即GET或POST。
bstrUrl: 服務網頁的URL。
varAsync: 是否同步執行。缺省為True,即同步執行,但只能在DOM中實施同步執行。用中一般將其置為False,即異步執行。
bstrUser: 用戶名,可省略。
bstrPassword:用戶口令,可省略。
Send方法:發送HTTP請求到服務器,返回應答。
語法:
oXMLHttpRequest.send(varBody)
說明:此方法是否同步取決於Open方法的varAsync參數。如果設為True則為同步,調用立刻返回,如果設為False調用直到整個應答被接收了才返回。
setRequestHeader( bstrHeader, bstrvalue )
bstrHeader:HTTP 頭(header)
bstrvalue: HTTP 頭(header)的值
如果Open方法定義為POST,可以定義表單方式上傳:
xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded")
三、XMLHTTP屬性:
onreadystatechange:在同步執行方式下獲得返回結果的事件句柄。只能在DOM中調用。
responseBody: 結果返回為無符號整數數組。
responseStream: 結果返回為IStream流。
responseText : 結果返回為字符串。
responseXML: 結果返回為XML格式數據。
四、示例:
< script language="javascript" >
function getDatal(url){
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0";//創建XMLHTTPRequest對象,需MSXML4.0支持 ["MSXML2.XMLHTTP.4.0","MSXML2.DOMDocument.4.0"]
xmlhttp.open("GET",url,false,"",""; //使用HTTP GET初始化HTTP請求
xmlhttp.send(""; //發送HTTP請求並獲取HTTP響應
return xmlhttp.responseXML; //獲取XML文檔
}
< /script >
現在網上流行的小偷程序比較多,有新聞類小偷,音樂小偷,下載小偷,那麼它們是如何做的呢,下面我來做個簡單介紹,希望對各位站長有所幫助。
(一)原理
小偷程序實際上是通過了XML中的XMLHTTP組件調用其它網站上的網頁。比如新聞小偷程序,很多都是調用了sina的新聞網頁,並且對其中的html進行了一些替換,同時對廣告也進行了過濾。用小偷程序的優點有:無須維護網站,因為小偷程序中的數據來自其他網站,它將隨著該網站的更新而更新;可以節省服務器資源,一般小偷程序就幾個文件,所有網頁內容都是來自其他網站。缺點有:不穩定,如果目標網站出錯,程序也會出錯,而且,如果目標網站進行升級維護,那麼小偷程序也要進行相應修改;速度,因為是遠程調用,速度和在本地服務器上讀取數據比起來,肯定要慢一些。
(二)事例
下面就XMLHTTP在ASP中的應用做個簡單說明
代碼: <%
'常用函數
'1、輸入url目標網頁地址,返回值getHTTPPage是目標網頁的html代碼
function getHTTPPage(url)
dim Http
set Http=server.createobject("MSXML2.XMLHTTP"
Http.open "GET",url,false
Http.send()
if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312"
set http=nothing
if err.number<>0 then err.Clear
end function
'2、轉換亂瑪,直接用xmlhttp調用有中文字符的網頁得到的將是亂瑪,可以通過adodb.stream組件進行轉換
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.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
'下面試著調用http://wmjie.51.net/swords的html內容
Dim Url,Html
Url="http://wmjie.51.net/swords/"
Html = getHTTPPage(Url)
Response.write Html
%>
------------------------------------------------------
代碼:
'代碼]用XMLHTTP讀取遠程文件
<%
Response.Buffer = True
Dim objXMLHTTP, xml
Set xml = Server.CreateObject("Microsoft.XMLHTTP"
xml.Open "GET", "http://wmjie.51.net/swords/diary.rar", False
xml.Send
' Add a header to give it a file name:
Response.AddHeader "Content-Disposition", _
"attachment;filename=mitchell-pres.zip"
' Specify the content type to tell the browser what to do:
Response.ContentType = "application/zip"
' Binarywrite the bytes to the browser
Response.BinaryWrite xml.responseBody
Set xml = Nothing
%>
-------------------------------------
如何寫ASP入庫小偷程序
入庫小偷的原理也很簡單:就是用XMLHTTP遠程讀取網頁的內容,然後根據需要,對讀到的內容進行加工(過濾,替換,分類),最後得到自己需要的數據,加入到數據庫中。
首先:我們先用XMLHTTP讀取遠程網頁(我的另一片文章中有介紹)。
其次:對內容進行過濾,這個是比較關鍵的步驟,比如說,我要從遠程網頁上提取出所有url連接,我應該怎麼做呢?
代碼:
‘這裡用的是正則式
Set objRegExp = New Regexp '建立對象
objRegExp.IgnoreCase = True '大小寫忽略
objRegExp.Global = True '全局為真
objRegExp.Pattern = "http://.+?" '匹配字段
set mm=objRegExp.Execute(str) '執行查找,str為輸入參數
For Each Match in mm '進入循環
Response.write(Match.Value) '輸出url地址
next
然後,我們需要根據需要做一些替換功能,把不必要的數據替換掉,這個比較簡單,用Replace函數即可。
最後,進行數據庫操作
-------------------------------
一個例子
代碼:
<%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312"
End function
'首先,進行小偷程序的一些初始化設置,以上代碼的作用分別是忽略掉所有非致命性錯誤,把小偷程序的運行超時時間設置得很長(這樣不會出現運行超時的錯誤),轉換原來默認的UTF-8編碼轉換成GB2312編碼,否則直接用XMLHTTP組件調用有中文字符的網頁得到的將是亂碼。
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP"
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
'然後調用XMLHTTP組件創建一個對象並進行初始化設置。
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.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
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring<=0 then Newstring=Len(wstr)
End Function
'處理抓取回來的數據需要調用adodb.stream組件並進行初始化設置。%>
'以下即為頁面顯示部分
<%
Dim wstr,str,url,start,over,city
'定義一些需要使用到的變量
city = Request.QueryString("id")
'程序傳回的ID變量(即用戶選擇的城市)賦給id
url="http://appnews.qq.com/cgi-bin/news_qq_search?city="&city&""
'這裡設置需要抓取的頁面地址,當然你也可以直接指定某個地址而不使用變量
wstr=getHTTPPage(url)
'獲取指定頁面的全部數據
start=Newstring(wstr," <html>")
'這裡設置需要處理的數據的頭部,這個變量應視不同情況而設置,具體內容可以通過查看需要抓取的頁面的源代碼來確定。因為在這個程序裡我們需要抓取整個頁面,所以設置為頁面全部抓取。注意,設置的內容必須是頁面內容唯一的,不可以重復。
over=Newstring(wstr," </HTML>")
'和start相對應的就是需要處理的數據的尾部,同樣的,設置的內容必須是頁面中唯一的。
body=mid(wstr,start,over-start)
'設置顯示頁面的范圍
'下面就是動用乾坤挪移***的時候了,通過replace可以用一些字符替換掉數據中指定的字符。
body = replace(body,"skin1","天氣預報 - 斯克網絡")
body = replace(body,"http://appnews.qq.com/cgi-bin/news_qq_search?city","tianqi.asp?id")
'本程序中已經完成了替換的工作,如果有其他需要的話可以繼續進行類似的替換操作。
response.write body
引用: 遠程獲取內容,並將內容存在本地電腦上,包括任何文件
<%
'----------遠程獲取內容,並將內容存在本地電腦上,包括任何文件!----------
'On Error Resume Next
'Set the content type to the specific type that you are sending.
'Response.ContentType = "IMAGE/JPEG"
'-------------------------------定義輸出格式-----------------------------
Path=request.querystring("p")
sPath = Path
if left(lcase(path),7) <> "http://"; then
'-------------如果前面沒有http就是本地文件,交給LocalFile處理------------
LocalFile(path)
else
'--------------------否則為遠程文件,交給RemoteFile處理------------------
RemoteFile(Path)
end if
'Response.Write err.Description
sub LocalFile(Path)
'-------------------如果為本地文件則簡單的跳轉到該頁面-------------------
Response.Redirect Path
End Sub
Sub RemoteFile(sPath)
'-------------------------處理遠程文件函數------------------------------
FileName = GetFileName(sPath)
'-------------GetFileName為把地址轉換為合格的文件名過程-------------
FileName = Server.MapPath("/UploadFile/Cache/" & FileName)
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write fileName
if objFso.FileExists(FileName) Then
'--------------檢查文件是否是已經訪問過,如是,則簡單跳轉------------
Response.Redirect "/uploadfile/cache/" & GetFileName(path)
Else
'----------------否則的話就先用GetBody函數讀取----------------------
'Response.Write Path
t = GetBody(Path)
'-----------------用二進制方法寫到浏覽器上--------------------------
Response.BinaryWrite t
Response.Flush
'-----------------輸出緩沖------------------------------------------
SaveFile t,GetFileName(path)
'------------------將文件內容緩存到本地路徑,以待下次訪問-----------
End if
Set objFso = Nothing
End Sub
Function GetBody(url)
'-----------------------本函數為遠程獲取內容的函數---------------------
'on error resume next
'Response.Write url
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
'----------------------建立XMLHTTP對象-----------------------------
With Retrieval
.Open "Get", url, False, "", ""
'------------------用Get,異步的方法發送-----------------------
.Send
'GetBody = .ResponseText
GetBody = .ResponseBody
'------------------函數返回獲取的內容--------------------------
End With
Set Retrieval = Nothing
'response.Write err.Description
End Function
Function GetFileName(str)
'-------------------------本函數為合格化的文件名函數-------------------
str = Replace(lcase(str),"http://";,"")
str = Replace(lcase(str),"//","/")
str = Replace(str,"/","")
str = replace(str,vbcrlf,"")
GetFileName = str
End Function
sub SaveFile(str,fName)
'-------------------------本函數為將流內容存盤的函數-------------------
'on error resume next
Set objStream = Server.CreateObject("ADODB.Stream")
'--------------建立ADODB.Stream對象,必須要ADO 2.5以上版本---------
objStream.Type = adTypeBinary
'-------------以二進制模式打開-------------------------------------
objStream.Open
objstream.write str
'--------------------將字符串內容寫入緩沖--------------------------
'response.Write fname
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite
'--------------------將緩沖的內容寫入文件--------------------------
'response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
'-----------------------關閉對象,釋放資源-------------------------
'response.Write err.Description
End sub
%>