Microsoft.NET: XMLHTTP: 網站超級粘合劑 發表於 Saturday, June 05 @ 11:25:57 CST by joezxh |
joe.zhang 投遞 "簡介
許多ASP開發人員都希望在自己的網站中能夠使用到微軟提供的支援XML的新功能。其中,有些人發現可以使用XML來裝飾網站,但是,如果僅僅是只使用XMLDOM的話,你就會失去其他一些更重要的東西。畢竟,XML是用來作為一種網上資料表現和資料交換的形象出現的。儘管使用XML可以非常滿意
地描繪你的資料,但是開發人員卻不得不使用CGI來進行瀏覽器和伺服器之間的資料交換,除非你在瀏覽器端和用戶端都使用XML文檔。
當然CGI從傳達資訊的角度來說是能夠完全勝任的,但是如果要是和XML來一起使用的話就讓XML失去了很多自己的用處。幸運的是,微軟提供了一種更加有效方法來傳輸XML,雖然該方法在很大程度上並不被人所重視。
在微軟提供的MSXML解譯器包中有一系列的對象,也許沒有人會重視其中的XMLHTTPConnection對象。簡而言之,它允許你開啟一個到伺服器上的HTTP串連,
發送一些資料和取回一些資料。並且所有的這一切都是在很少的幾段指令碼中就能夠實現。使用XMLHTTP對象通常是進行XML資料交換,但其他格式的資料也是允許的。
在商業程式中的運用
這種交換類型的標準模式是用戶端發送一個XML格式的文本字串到服務端,然後服務端將這個字串裝載入一個XMLDOM對象中並且解釋它,然後返回一段HTML給用戶端,或則是另外一段XML代碼給用戶端讓用戶端的瀏覽器自己解釋。
在這種方式下,對於資訊的傳遞來說是非常有效形式,尤其是當你使用DHTML允許你根據返回資訊動態顯示時。
舉例如下(只能夠運行在用戶端和服務端都安裝有IE5的情況下)
在上面的代碼中,其中用戶端的指令碼將建立一個適當的COM對象,開啟一個在網站
www.yoursite.com的串連(使用了HTTP的POST方法,同步方式),使用Send方法發送
一個XML片段,然後根據伺服器上的響應填充divDisplay地區(這裡使用了DHTML)。
具體的執行過程是,在伺服器上,Request對象被轉載入一個XML文檔然後被解譯器解釋。
伺服器響應XMLHTTP串連的方式和響應其他任何方式的HTTP串連是一樣的,也是使用了
Response對象。注意的是XMLHTTP本身並不檢查request或則response的有效性,也就是說
Request或則Response中的資料可是並不需要一定是XML文檔。
“聰明,”你也許會說。“但是為什麼我們不使用CGI來代替它呢?”呵呵,我們要注意
這樣一件事,就是如果使用這種方式進行用戶端--服務端的互動時整個頁面並沒有被重新整理。
我們都知道,如果要是通過CGI來做任何事情都必將導致瀏覽器接收一個完整的新頁面,而
這尤其影響網站上的訪問者,因為他們不得不把所有的時間都用來等候整個頁面下載完畢。
同樣,CGI對於網站伺服器來說也是一個負擔,因為它不得不把寶貴的處理器重複持續時間和頻寬
消耗在新頁面的所有部分。如果這樣的操作只是一次或則兩次倒無所謂,但是如果是對任何
一個電子商務網站或則一個基於Web的電子郵件系統,這將意味著大量的同樣的基本頁面資訊
被重複一次又一次的裝載。
同樣,如果是通過CGI在網站運用程式中使用XML,服務端一般都將不得不根據資料來建立
XML的文檔,然後才能夠對這些文檔進行自己需要的處理。在這種方式下,伺服器將花費
大量的精力在處理如何建構這些XML文檔上,尤其是當需要傳送的資料量很大時。
所以如果是讓用戶端的瀏覽器來建立這個XML文檔,並且在建立完畢後通過XMLHTTP將最後的
產品傳遞給伺服器,這將大大減輕服務端的代碼量和負擔。
這種類型的問題的一個例子是給伺服器上的XML文檔增加資料。如果是使用CGI的話,那麼
就需要頻繁的查詢一個CGI的form,然後才能夠構建一個加入XML文檔的XML節點。而如果是使用
XMLHTTP需要做的僅僅是把這個XML節點傳遞給服務端就可以了。
上面說討論的是XMLHTTP基本部分,有關它的詳細例子你可以在Microsoft Developers
Network中找到例子 。雖然使用這種通訊方式可以大有作為,我在我自己的運用中僅僅只是
使用到了很少的一部分,也許任何一個聰明的開發人員都能夠發現更多的運用案例。
使用XMLHTTP而不是CGI(即使是我們心愛的ASP)能夠讓我編寫更多野心勃勃的網站運用
程式,因為現在我們所關心的簡單到只是我們需要發送的資料而已。從而使用很少的代碼
就能夠實現非常複雜的功能,而CGI對於使用者每一個可能的操作都需要我們來完完整整地
產生一個新的頁面。
但是由於目前並不是所有的瀏覽器都支援MSXML,許多使用ASP編寫的為了非企業內部
目的的運用程式需要支援CGI的互動。但是欣慰的是,編寫一個同時支援CGI和XMLHTTP資料
的頁面並不是很困難,並且將CGI的資料載入XML文檔中花費的工作量也不是很大。
最簡單的方式來判斷資料是CGI的資料還是XML的資料就是判斷資料的MIME類型.
XMLHTTP的MIME是一個Null 字元串,除非你特定了其他的MIME類型 (可以到這個串連
查看不同的MIME類型http://msdn.microsoft.com/xml/reference/scriptref/XMLHttpRequest_object.asp).
而許多CGI的MIME類型是"application/x-www-form-urlencoded"
下面就是一個來判斷的程式碼片段:
if (Request.ServerVariables("REQUEST_METHOD") == "POST" )
{
if (Request.ServerVariables("CONTENT_TYPE")=="application/x-www-form-urlencoded")
{//如果是常規資料,讓CGI來處理
Response.write(Request.form("stuff"));
}
else
{//如果是XMLHTTP串連,將Request對象轉載入XML解譯器
var req= Server.CreateObject("Microsoft.XMLDOM");
req.resolveExternals=false;
req.validateOnParse=false;
req.async=false;
req.load(Request);
Response.write(req.documentElement.selectSingleNode("stuff").text);
}
}
else{ %>
這是一種簡單明了的在同一個ASP頁面中即可以處理CGI也可以處理XMLHTTP資料的方法。
並且它也提供了一種能夠相容在用戶端安裝了IE5.0以及使用其他其他瀏覽器瀏覽網站的模式。
或則也可以採取另外一種方法,就是我對所有的網站運用程式還是採用以前的CGI介面,
但是在其他類型的用戶端運用程式使用XMLHTTP方法,例如Microsoft Office運用程式。
XMLHTTP的功能並不僅僅局限在瀏覽器上,我在Microsoft Office的VBA開發程式中使用XMLHTTP
取得了巨大的成功。現在我假設我被要求使用XML技術在更新我公司伺服器上的Excel電子錶
格中的資料。Excel能夠將HTML表格直接轉載到自己的表格中,但是它不能夠處理格式複雜的
頁面,例如本頁。資料除非使用了非常巧妙的技巧根本沒法插入試算表。
我的解決方案是編寫了一個ASP頁面來操縱通過XMLHTTP從Excel中傳遞過來的資料。
通過一個VBA的宏給伺服器發送一個請求,然後將響應載入XML文檔,通過解譯器解釋後再
插入Excel的試算表中。這將是一個無痕的解決方案,簡單的一個按鈕也許會讓你的老闆、
同事或任何其他人的關係大有改觀。
下面是我實現上述方法的一個程式碼片段。它使用XMLHTTP將伺服器中的資訊載入,然後將
其插入試算表中。
Public Sub UpdateSheet()
Dim xmlhttp
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
Call xmlhttp.Open("POST", "http://www.yourserver.com/yourpage.asp", False)
Call xmlhttp.send("")
Dim xmldoc
Set xmldoc = CreateObject("Microsoft.XMLDOM")
xmldoc.async = False
xmldoc.loadxml(xmlhttp.responsexml)
Worksheets("TimeSheet").Range("A1").Value = xmldoc.documentelement.getAttribute("firstname")
Worksheets("TimeSheet").Range("B1").Value = xmldoc.documentelement.getAttribute("lastname")
Worksheets("TimeSheet").Range("C37").Value = xmldoc.documentelement.selectSingleNode("totalhours").Text
End Sub
這個VBA的宏相當的簡單。給伺服器發送一個請求,然後將伺服器上的響應插入
XML文檔,然後更新Excel中cell中的內容。當然,我們可以使用這個技術做其他更多的運用。
例如從一個Office運用程式中上傳資料到伺服器上的XML文檔中(XML應該是你首選的格式,
而不是Office 2000中提供的愚蠢的OfficeXML實現).或則把XML/ASP作為一個你資料庫的shell
這樣,你的運用程式對於資料庫就有了一個簡潔、統一的介面,而對資料庫結構的
改動就不必要改動你所有的用戶端代碼了。
我發現XMLHTTP對象在我的編程中非常的有用。我一般使用Visual Basic, Delphi, 和 Visual J++編寫程式,在這個過程中,我經常發現這些語言各自對線上程式處理的方法非常地不同,
他們各自有自己的對網路程式的處理機制,但是如果你要是在處理網路程式時都使用統一
的XMLHTTP串連方式,那麼串連伺服器的代碼將非常小,甚至更最佳化,這是一種對所有的
語言都統一的介面。
"