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']}"
}
}