1。編寫cgi
簡單的cgi程式如下:
#!/usr/bin/env ruby
print "HTTP/1.0 200 OKrn"
print "Content-type: text/htmlrnrn"
print "Hello World!rn"
我們可以用ruby來處理提交的參數,填充模板,產生html等,但稍顯麻煩,可以用cgi模組。
2。使用cgi.rb
cgi.rb用來編寫cgi指令碼,他可以操作form,cookies,環境變數,維護session等。具體用法你應該知道去哪裡找吧。
3。引用和轉義
/在url裡是一個特殊字元,還有< 和>等,有時候需要轉義(escaped),例如/被轉成%2F。cgi.rb提供了兩個函數,CGI.escape 和CGI.unescape:
require 'cgi'
puts CGI.escape( "Nicholas Payton/Trumpet & Flugel Horn" )
產生結果:
Nicholas+Payton%2FTrumpet+%26+Flugel+Horn
轉義html文檔中元素的例子(略):
4。表單 form
類cgi可以用兩種方法取得用戶端提交的資料。加入使用者提交了lookup?player=tom&year=1958,我們可以直接用cgi[]數組訪問它。
require 'cgi'
cgi = CGI.new
cgi['player'] # -> ["tom"]
cgi['year'] # -> ["1958"]
另一個辦法是你用一個hash表,取得所有參數及值。
require 'cgi'
cgi = CGI.new
h = cgi.params
h['player'] # -> ["tom"]
5。產生form和html
cgi類提供了非常多的用來產生html的方法,幾乎是每一個tag一個方法。還是例子來得直觀:
require "cgi"
cgi = CGI.new("html3") # add HTML generation methods
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
}
}
}
}
產生如下代碼:
6。cookies
require "cgi"
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");
cgi = CGI.new("html3")
cgi.out( "cookie" => [cookie] ){
cgi.html{
"nHTML content here"
}
}
產生的頭如下:
Content-Type: text/html
Content-Length: 86
Set-Cookie: rubyweb=CustID%3D123&Part%3DABC; path=
然後,當使用者再訪問頁面的時候,你就可以讀取這個值了。
require "cgi"
cgi = CGI.new("html3")
cgi.out{
cgi.html{
cgi.pre{
cookie = cgi.cookies["rubyweb"]
"nCookies aren" + cookie.value.join("n")
}
}
7。sessions
處理session需要額外多一個類:CGI::Session
require "cgi"
require "cgi/session"
cgi = CGI.new("html3")
sess = CGI::Session.new( cgi, "session_key" => "rubyweb",
"session_id" => "9650",
"new_session" => true,
"prefix" => "web-session.")
sess["CustID"] = 123
sess["Part"] = "ABC"
cgi.out{
cgi.html{
"nHTML content here"
}
}
讀取session通過如下代碼:
require "cgi"
require "cgi/session"
cgi = CGI.new("html3")
sess = CGI::Session.new( cgi, "session_key" => "rubyweb",
"prefix" => "web-session.")
cgi.out{
cgi.html{
"nCustomer #{sess['CustID']} orders an #{sess['Part']}"
}
}