av网站免费线看精品_国产做a爱视频免费不_深爱激情网开心五月天_伊人五月天在线视频网

 
Perl在WAP網(wǎng)站中應用實例一談
發(fā)布時間:2005-03-28   瀏覽次數(shù):1229431
出處:塞迪網(wǎng) 作者:Cool007前言: WAP是無線應用程序通訊協(xié)議(WirelessApplicationProtocal的簡稱。WAP定義了一套由XML標準延伸而來的標記語言,稱為「無線標記語言WirelessMarkupLanguage,WML」),專門用來將準備傳送給無線上網(wǎng)設備的內(nèi)容進行編碼。與HTML用來定義資料在一般網(wǎng)絡瀏覽器上面的顯示與動作方式的標記語言那樣,WML是用來定義資料如何在無線上網(wǎng)設備上顯示與動作的標記語言。WAP與WML技術(shù)對于提供信息給客戶與在辦公室外工作的員工來說,都是相當適合的技術(shù)。在這里我將會通過幾個簡單的例子向大家介紹在Perl程序語言在WAP網(wǎng)站的的應用,使你對Perl語言有一個更深入的認識。 注:本文部份資料譯自ComprehensivePerlArchiveNetwork網(wǎng)站(網(wǎng)址:http://cpan.org/)本文適用于對XML和HTTP有一定認識的讀者。 1、編寫動態(tài)CGI程序 由于WAP同樣使用HTTP通訊協(xié)議,因此你可以依照為一般網(wǎng)絡瀏覽器開發(fā)動態(tài)內(nèi)容程序相同的設計策略來為無線上網(wǎng)工具開發(fā)應用程序。事實上,你甚至可以說兩者的開發(fā)流程除了一些特定的細節(jié)部分以外,大致上都是相同的。首先,一般的網(wǎng)絡瀏覽器接受的內(nèi)容類型(HTTP通訊中的Content-Type表頭)信息為text/html,而無線上網(wǎng)的客戶端程序則要求你的程序送出text/vnd.wap.wml做為內(nèi)容類型的值。其次,由于傳送給無線上網(wǎng)客戶端程序的文件事實上是一個XML文件,因此你必須將XML文件類型宣告字符串一并送出。只要你注意以上兩點,那么你便可以開始傳送你的內(nèi)容了。下面是一個很簡單的傳送WML文件的CGI程序。 #!/usr/bin/perl print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"歡迎來到我的WAP網(wǎng)站!\n"; print"\n"; print"\n"; 這個例子演示了如何在WML文件里面?zhèn)魉驼_的HTTP與XML表頭信息給瀏覽器。由于我們傳送的實際上是一個XML文件,因此在輸出資料的時候請記得要遵循正確的語法與格式。一般的網(wǎng)絡瀏覽器對于內(nèi)容類型或者表頭宣告等信息的語法和格式都非常寬容,然而WAP客戶端程序卻非如此。 上面這個程序所輸出的內(nèi)容雖然是實時產(chǎn)生的,但是它在任何狀況下送出的內(nèi)容都是完全相同的,互動性不是很好。為了解決這個問題,你可以通過CGI函式庫來讀取客戶端送入的資料,并且根據(jù)這些傳入的資料來實時建立新的內(nèi)容傳送回客戶端。WML本身被設計成盡可能內(nèi)容能實時產(chǎn)生越好,這樣的設計讓頁面中的每一個deck元素可以不需要送出新的HTTP請求給服務器便可以從一個card元素移動到另一個card元素。不過這也意味著你在接收從WML文件傳入的資料的時候要格外小心,必須確認一個card元素確實有傳送所有的變量到服務器端才行。在下面的范例程序會從客戶端讀取來自不同card元素所送出的參數(shù),并且將這些參數(shù)傳送給服務器,然后據(jù)此建立一個新的deck元素。 #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; if($input->param("completed")){ print"\n"; print"\n"; print"Welcometomydynamicwirelesscgi\n\n"; print"Yournameis:"; print"".$input->param("first_name").""; print"".$input->param("middle_name").""; print"".$input->param("last_name").""; print"\n"; print"\n"; print"\n"; }else{ print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourfirstname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourmiddlename\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourlastname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"DeckSummary:\n"; print"Firstname:\$first_name\n"; print"Midname:\$middle_name\n"; print"Lastname:\$last_name\n"; print"PressContinuetosendtoserver\n"; print"\n"; print"\n"; } 這個程序會讀取來自每個card元素所送出的參數(shù),并且將他們以HTTPget請求的型式傳送給服務器。請注意在一個名為finish的card元素里面,我們在每一個WML變量(例如$first_name)的前面全都加上一個斜線,這樣才可以避免Perl將它們誤認為Perl程序本身的變量來看待。一旦這些變量成功傳送給服務器,我們的CGI程序便可以像其它任何一般的CGI變量那樣讀取它們。 2、編寫控制客戶端存取處理程序 WAP設備是在低頻寬的網(wǎng)絡環(huán)境下運作的,因此它們首先將內(nèi)容儲存在自身的高速緩存里面,以避免無謂的資料請求與傳送過程。只是傳送CGI參數(shù)給我們的CGI程序并不能保證我們送出的內(nèi)容不會被WAP設備儲存在高速緩存里面。無線上網(wǎng)設備會將它們儲存起來,以URL做為索引鍵值,接下來每當有指向到該URL的請求的時候便會直接把之前儲存的資料傳回去,而不會向服務器詢問這個頁面從上次瀏覽過后是否已有更新過的資料。 在下面這個范例程序里面將時間與日期以WML的deck元素型式回傳給WAP設備,并且附有一個OK按鈕以便再次向服務器要求傳送新的當時時間與日期。這個程序也要求使用者輸入他的名字,以便自定回傳的內(nèi)容。 #!/usr/bin/perl useCGI; useDate::Format; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; my$time=time2str("%a%b%e%T%Y\n",time); print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; if($input->param("name")){ print"".$input->param("name").",\n"; } print"現(xiàn)在時間是︰".$time."\n"; print"請輸入你的姓名︰\n"; print"\n"; print"\n"; print"\n"; 當我們把上面這個程序放入模擬器去執(zhí)行,我們在模擬器的請求紀錄文件里面發(fā)現(xiàn)下面這些紀錄: cachemiss:http://wap.server.com/wml4.cgi cachemiss:http://wap.server.com/wml4.cgi?name=James cachehit:http://wap.server.com/wml4.cgi?name=James cachehit: 行請求紀錄沒有帶入任何CGI參數(shù),該筆記錄實際通過網(wǎng)絡向服務器送出請求,而程序則傳回當時的時間做為響應。第二行紀錄有帶入一個CGI參數(shù),該紀錄同樣也實際通過網(wǎng)絡向服務器送出了請求。然而從第三行記錄開始,WAP模擬器便不再向服務器實際提出請求了,而是直接將之前存入高速緩存的數(shù)據(jù)取出并顯示在畫面上,此時使用者收到的便是不正確的資料了。 有兩種方式可以使WAP裝置通過網(wǎng)絡實際向服務器提出請求。種是在程序中手動送出HTTP表頭,告知客戶端這個頁面已經(jīng)過期并且需要重新取得更新過的版本。在上面的范例里面,你可以在Content-type表頭后面再加上兩個額外的表頭,以強迫WAP裝置向服務器取得新的內(nèi)容而非直接取用高速緩存中的資料: print"Content-type:text/vnd.wap.wml\n"; print"Last-Modified:".time2str("%a,%e%b%Y%T",time)."GMT\n"; print"Expires:".time2str("%a,%e%b%Y%T",time)."GMT\n"; print"Cache-Control:no-cache,must-revalidate\n"; print"Pragma:no-cache\n\n"; 第二個方式則是在送出的WML原始碼的區(qū)域里面加入與快取控制相關的卷標: 上面這些卷標和之前我們修改過后的HTTP表頭具有相同的功用。 3、編寫請求表頭 現(xiàn)在你已經(jīng)制作供無線上網(wǎng)設備讀取的內(nèi)容了,接下來的任務便是針對不同廠商與型號的移動電話制作合適的內(nèi)容了。在建立WAP網(wǎng)站的時候?qū)媾R的困擾是:不同的WAP瀏覽器所支持的功能都稍有不同。不過,無線上網(wǎng)設備所傳送給服務器的請求表頭里面會告訴我們該軟件的類型與支持的功能種類。在下面的例子中會將WAP瀏覽器傳送給服務器的請求表頭全部顯示出來︰ #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; print"\n"; print"\n"; foreach$header(%ENV){ if($header=~/^HTTP/){ print"$header:$ENV{$header}\n"; } } print"\n"; print"\n"; 不同客戶端所傳送過來的表頭信息基本上都是大致相同的,其中有些信息你可以略過不看。但是這當中的確有些信息對我們來說是格外有用的。舉例來說,正如同一般的網(wǎng)絡瀏覽器那樣,WAP瀏覽器會傳送一個User-Agent字符串給服務器,該字符串的內(nèi)容指明了該型號的手機所使用的瀏覽器類型與版本。Perl將這個表頭信息以瀏覽器名稱/版本的型式(BROWSER/VERSION)儲存在HTTP_USER_AGENT這個變量里面。這項信息之所以有用之處在于并非每一種無線上網(wǎng)設備的瀏覽器都支持WAP格式。你可能會遇到有些瀏覽器僅接受HDML格式的內(nèi)容,而非WML。你可以建立一個索引表格來紀錄這些不支持WML的瀏覽器,并且將它們屏除在程序服務的范圍之外;蛘吣阋部梢詸z查HTTP_ACCEPT這個表頭信息的值,看看其中是否有text/vnd.wap.wml這個字符串,如果沒有的話代表該瀏覽器并不支持WML格式的內(nèi)容。 此外,HTTP_X_UP_SUBNO這個表頭信息代表該移動電話的全球識別代碼(每一部手機都不同)。你可以地通過這個信息來辨認出某支特定的移動電話,而不需要傳送cookie。不同于沒有識別碼的一般網(wǎng)絡瀏覽器,同一支移動電話每次連結(jié)到你的服務器的時候都會傳送同樣的識別碼給你的程序。 4、用Mason組件來制作WAP網(wǎng)站如何提供WML格式的內(nèi)容服務 如果你的網(wǎng)站是使用HTML的Mason組件來建立的,你還是可以照樣為WAP設備提供WML格式的內(nèi)容服務的。不過你的確需要以與原本稍微不同的方式來撰寫你的Mason組件。這其中最重要的地方在于你必須記得要把XML格式宣告放在實際輸出內(nèi)容的行。如果在HTTP表頭與XML格式宣告之間有任何內(nèi)容被送出,那么WAP設備便無法正常讀取你所送出的內(nèi)容了。其它較為重要的改變在于區(qū)段,在這里面的HTTP內(nèi)容類型資料必須符合WAP設備所要求的類型(即text/vnd.wap.wml)。下面是用Mason來撰寫WAP程序的例子: #!/usr/bin/perl useCGI; print"Content-type:text/vnd.wap.wml\n\n"; print"\n"; print"\n"; my$input=newCGI; if($input->param("completed")){ print"\n"; print"\n"; print"Welcometomydynamicwirelesscgi\n\n"; print"Yournameis:"; print"".$input->param("first_name").""; print"".$input->param("middle_name").""; print"".$input->param("last_name").""; print"\n"; print"\n"; print"\n"; }else{ print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourfirstname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourmiddlename\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"Pleaseenteryourlastname\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"\n"; print"DeckSummary:\n"; print"Firstname:\$first_name\n"; print"Midname:\$middle_name\n"; print"Lastname:\$last_name\n"; print"PressContinuetosendtoserver\n"; print"\n"; print"\n"; } 小結(jié): WAP所能夠提供的內(nèi)容顯然無法和一般Web瀏覽器相提并論,然而它卻的確提供了一個極具彈性的應用程序開發(fā)環(huán)境。我希望本文對你在無線網(wǎng)絡構(gòu)建上有所幫助。
立即預約