位置:首頁 > 腳本語言 > Ruby基礎教程 > Ruby Web應用 - CGI編程

Ruby Web應用 - CGI編程

Ruby是一種通用的語言,它不能適當地被稱為Web語言。即便如此,Web應用和Web工具一般是Ruby的中最常見的用途。

Ruby不僅可以寫SMTP服務器,FTP守護進程或Ruby Web服務器,但也可以使用Ruby開發CGI程序或作為替代PHP更常見的任務。

請花幾分鐘CGI編程基礎教程及CGI編程的更多細節。

編寫CGI腳本:

最基本的Ruby CGI腳本看起來像這樣:

#!/usr/bin/ruby

puts "HTTP/1.0 200 OK"
puts "Content-type: text/html

"
puts "<html><body>This is a test</body></html>"

如果調用這個腳本 test.cgi 上傳到基於Unix/Linux的Web托管服務提供商並具有合適的權限,那麼可以將它作為一個CGI腳本使用。

例如,如果有一個Linux的Web托管服務提供商托管的網站,如:http://www.gitbook.net/test.cgi 的主目錄,並給它執行權限,那麼訪問 http://www.gitbook.net/test.cgi 應該返回一個HTML頁麵顯示:This is a test.

這裡時當 test.cgi 從Web瀏覽器請求,Web服務器看執行使用Ruby解釋器它。 Ruby腳本返回一個基本的HTTP頭,然後返回一個基本的HTML文檔。

使用 cgi.rb:

Ruby有一個特殊的稱為CGI庫,使更複雜的交互相比前麵的CGI腳本。

讓我們創建一個基本的CGI使用CGI腳本:

#!/usr/bin/ruby

require 'cgi'

cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"

在這裡,創建了一個CGI對象,並用它來打印標題行。

表單處理:

使用CGI類使可以訪問HTML查詢參數有兩種方法。假設我們給出 /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali.

可以訪問參數FirstName和LastName使用CGI#[]如下:

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['FirstName'] # =>  ["Zara"]
cgi['LastName']  # =>  ["Ali"]

還有另一種方法來訪問這些表單變量。此代碼會給出所有的項和值的哈希值:

#!/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"]

如果表單包含多個具有相同名稱的字段,對應的值將被返回到腳本中為一個數組。[]存取器返回這些的隻是第一個。

在這個例子中,假設名為“name”的表單有三個字段,我們輸入了三個名字 "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的會自動處理GET和POST方法。冇有單獨的處理這兩種不同的方法。

一個相關的,但基本形式,可以發送正確的數據,將有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>

創建表單和HTML:

CGI包含大量的方法用於創建HTML。會發現每個標簽的方法之一。為了使這些方法,必須通過調用CGI.new創建一個CGI對象。

為了使標簽更容易嵌套,這些方法拿自己的內容作為代碼塊。代碼塊返回一個字符串,這將在作為標簽的內容。例如:

#!/usr/bin/ruby

require "cgi"
cgi = CGI.new("html4")
cgi.out{
   cgi.html{
      cgi.head{ "
"+cgi.title{"This Is a Test"} } +
      cgi.body{ "
"+
         cgi.form{"
"+
            cgi.hr +
            cgi.h1 { "A Form: " } + "
"+
            cgi.textarea("get_text") +"
"+
            cgi.br +
            cgi.submit
         }
      }
   }
}

注:CGI類的方法可以接受的方法參數,這將設置HTTP方法(GET,POST等)上使用的表單提交。缺省情況下,在這個例子中使用的是POST。

這將產生以下結果:

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>

引用字符串:

當處理URL和HTML代碼,您必須謹慎地引用一些字符。例如,一個斜杠字符(/)在URL中具有特殊的意義,所以它必須被轉義,如果它不是部分路徑名。

例如,/查詢URL部分將被翻譯成字符串%2F/,使用它時必須翻譯。空間和與符號特殊字符。為了處理這個問題,CGI提供:在例行程序 CGI.escape 和 CGI.unescape.

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

這將產生以下結果:

Zara+Ali%2FA Sweet+%26+Sour+Girl")
#!/usr/bin/ruby

require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')

這將產生以下結果:

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'

CGI類有用的方法:

下麵有關CGI類的所有方法的完整列表:

  • Ruby CGI - 方法相關標準CGI庫。

Cookies 和 Sessions:

已經解釋這兩個概念,在不同的環節。請按照這些鏈接:

 

  •