用Ruby進(jìn)行CGI編程的入門指引
編寫CGI腳本:
最基本的Ruby CGI腳本看起來像這樣:
#!/usr/bin/ruby puts "HTTP/1.0 200 OK" puts "Content-type: text/html\n\n" puts "<html><body>This is a test</body></html>"
如果調(diào)用這個(gè)腳本 test.cgi 上傳到基于Unix/Linux的Web托管服務(wù)提供商并具有合適的權(quán)限,那么可以將它作為一個(gè)CGI腳本使用。
例如,如果有一個(gè)Linux的Web托管服務(wù)提供商托管的網(wǎng)站,如:http://www.yiibai.com/test.cgi 的主目錄,并給它執(zhí)行權(quán)限,那么訪問 http://www.yiibai.com/test.cgi 應(yīng)該返回一個(gè)HTML頁(yè)面顯示:This is a test.
這里時(shí)當(dāng) test.cgi 從Web瀏覽器請(qǐng)求,Web服務(wù)器看執(zhí)行使用Ruby解釋器它。 Ruby腳本返回一個(gè)基本的HTTP頭,然后返回一個(gè)基本的HTML文檔。
使用 cgi.rb:
Ruby有一個(gè)特殊的稱為CGI庫(kù),使更復(fù)雜的交互相比前面的CGI腳本。
讓我們創(chuàng)建一個(gè)基本的CGI使用CGI腳本:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new puts cgi.header puts "<html><body>This is a test</body></html>"
在這里,創(chuàng)建了一個(gè)CGI對(duì)象,并用它來打印標(biāo)題行。
表單處理:
使用CGI類使可以訪問HTML查詢參數(shù)有兩種方法。假設(shè)我們給出 /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali.
可以訪問參數(shù)FirstName和LastName使用CGI#[]如下:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi['FirstName'] # => ["Zara"] cgi['LastName'] # => ["Ali"]
還有另一種方法來訪問這些表單變量。此代碼會(huì)給出所有的項(xiàng)和值的哈希值:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new h = cgi.params # => {"FirstName"=>["Zara"],"LastName"=>["Ali"]} h['FirstName'] # => ["Zara"] h['LastName'] # => ["Ali"]
以下是代碼來檢索所有的鍵:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi.keys # => ["FirstName", "LastName"]
如果表單包含多個(gè)具有相同名稱的字段,對(duì)應(yīng)的值將被返回到腳本中為一個(gè)數(shù)組。[]存取器返回這些的只是第一個(gè)。
在這個(gè)例子中,假設(shè)名為“name”的表單有三個(gè)字段,我們輸入了三個(gè)名字 "Zara", "Huma" and "Nuha":
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi['name'] # => "Zara" cgi.params['name'] # => ["Zara", "Huma", "Nuha"] cgi.keys # => ["name"] cgi.params # => {"name"=>["Zara", "Huma", "Nuha"]}
注:Ruby的會(huì)自動(dòng)處理GET和POST方法。沒有單獨(dú)的處理這兩種不同的方法。
一個(gè)相關(guān)的,但基本形式,可以發(fā)送正確的數(shù)據(jù),將有HTML代碼,就像這樣:
<html> <body> <form method="POST" action="http://www.example.com/test.cgi"> First Name :<input type="text" name="FirstName" value="" /> <br /> Last Name :<input type="text" name="LastName" value="" /> <input type="submit" value="Submit Data" /> </form> </body> </html>
創(chuàng)建表單和HTML:
CGI包含大量的方法用于創(chuàng)建HTML。會(huì)發(fā)現(xiàn)每個(gè)標(biāo)簽的方法之一。為了使這些方法,必須通過調(diào)用CGI.new創(chuàng)建一個(gè)CGI對(duì)象。
為了使標(biāo)簽更容易嵌套,這些方法拿自己的內(nèi)容作為代碼塊。代碼塊返回一個(gè)字符串,這將在作為標(biāo)簽的內(nèi)容。例如:
#!/usr/bin/ruby require "cgi" cgi = CGI.new("html4") cgi.out{ cgi.html{ cgi.head{ "\n"+cgi.title{"This Is a Test"} } + cgi.body{ "\n"+ cgi.form{"\n"+ cgi.hr + cgi.h1 { "A Form: " } + "\n"+ cgi.textarea("get_text") +"\n"+ cgi.br + cgi.submit } } } }
注:CGI類的方法可以接受的方法參數(shù),這將設(shè)置HTTP方法(GET,POST等)上使用的表單提交。缺省情況下,在這個(gè)例子中使用的是POST。
這將產(chǎn)生以下結(jié)果:
Content-Type: text/html Content-Length: 302 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN"> <HTML> <HEAD> <TITLE>This Is a Test</TITLE> </HEAD> <BODY> <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded"> <HR> <H1>A Form: </H1> <TEXTAREA COLS="70" NAME="get_text" ROWS="10"></TEXTAREA> <BR> <INPUT TYPE="submit"> </FORM> </BODY> </HTML>
引用字符串:
當(dāng)處理URL和HTML代碼,您必須謹(jǐn)慎地引用一些字符。例如,一個(gè)斜杠字符(/)在URL中具有特殊的意義,所以它必須被轉(zhuǎn)義,如果它不是部分路徑名。
例如,/查詢URL部分將被翻譯成字符串%2F/,使用它時(shí)必須翻譯??臻g和與符號(hào)特殊字符。為了處理這個(gè)問題,CGI提供:在例行程序 CGI.escape 和 CGI.unescape.
#!/usr/bin/ruby require 'cgi' puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
這將產(chǎn)生以下結(jié)果:
Zara+Ali%2FA Sweet+%26+Sour+Girl") #!/usr/bin/ruby require 'cgi' puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')
這將產(chǎn)生以下結(jié)果:
<h1>Zara Ali/A Sweet & Sour Girl</h1>'
相關(guān)文章
優(yōu)化Ruby代碼使程序運(yùn)行速度提高的例子
這篇文章主要介紹了優(yōu)化Ruby代碼使程序運(yùn)行速度提高的例子,文中引用的項(xiàng)目把一個(gè)Ruby項(xiàng)目的運(yùn)行時(shí)間從20秒優(yōu)化到1.5秒,效果非常明顯,需要的朋友可以參考下2015-04-04使用Ruby on Rails快速開發(fā)web應(yīng)用的教程實(shí)例
這篇文章主要介紹了使用Ruby on Rails快速開發(fā)web應(yīng)用的教程實(shí)例,本文來自于IBM官方技術(shù)文檔,需要的朋友可以參考下2015-04-04Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器
這篇文章主要介紹了Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器,本文先是介紹了生成器的概念,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01對(duì)優(yōu)化Ruby on Rails性能的一些辦法的探究
這篇文章主要介紹了對(duì)優(yōu)化Ruby on Rails性能的一些辦法的一些探究,包括避免內(nèi)存密集型的應(yīng)用和GC等相關(guān)問題的探討,需要的朋友可以參考下2015-11-11Ruby中使用SWIG編寫ruby擴(kuò)展模塊實(shí)例
這篇文章主要介紹了Ruby中使用SWIG編寫ruby擴(kuò)展模塊實(shí)例,SWIG是一種簡(jiǎn)化腳本語(yǔ)言與C/C++接口的開發(fā)工具,需要的朋友可以參考下2014-09-09Ruby和Ruby on Rails中解析JSON格式數(shù)據(jù)的實(shí)例教程
這篇文章主要介紹了Ruby和Ruby on Rails中解析JSON格式數(shù)據(jù)的實(shí)例教程,文中介紹到的Ruby on Rails中的JSON解析工具包json_pure使用起來十分方便,需要的朋友可以參考下2016-04-04