ruby 是一门通用的语言,不仅仅是一门应用于web开发的语言,但 ruby 在web应用及web工具中的开发是最常见的。
使用ruby您不仅可以编写自己的smtp服务器,ftp程序,或ruby web服务器,而且还可以使用ruby进行cgi编程。
接下来,让我们花点时间来学校ruby的cgi编辑。
为了更好的了解cgi是如何工作的,我们可以从在网页上点击一个链接或url的流程:
cgi程序可以是 ruby 脚本,python 脚本,perl 脚本,shell 脚本,c 或者 c++ 程序等。
在你进行cgi编程前,确保您的web服务器支持cgi及已经配置了cgi的处理程序。
apache 支持cgi 配置:
设置好cgi目录:
scriptalias /cgi-bin/ /var/www/cgi-bin/
所有的http服务器执行cgi程序都保存在一个预先配置的目录。这个目录被称为cgi目录,并按照惯例,它被命名为/var/www/cgi-bin目录。
cgi文件的扩展名为.cgi,ruby 也可以使用 .rb 扩展名。
默认情况下,linux服务器配置运行的cgi-bin目录中为/var/www。
如果你想指定其他运行cgi脚本的目录,可以修改httpd.conf配置文件,如下所示:
<directory "/var/www/cgi-bin">
allowoverride none
options +execcgi
order allow,deny
allow from all
</directory>
在 addhandler 中添加 .rb 后缀,这样我们就可以访问 .rb 结尾的 ruby 脚本文件:
addhandler cgi-script .cgi .pl .rb
最脚本的 ruby cgi 代码如下所示:
#!/usr/bin/ruby puts "http/1.0 200 ok" puts "content-type: text/html\n\n" puts "this is a test"
你可以将该代码保持到 test.cgi 文件中,上次到服务器并赋予足够权限,即可作为 cgi 脚本执行。
如果你站的的地址为http://www.example.com/ ,即可用过http://www.example.com/test.cgi 访问该程序,输出结果为: "this is a test."。
浏览器访问该网址后,web 服务器会在站点目录下找到 test.cgi文件,然后通过ruby解析器来解析脚本代码并访问html文档。
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库可以通过两种方式获取表单提交(或url中的参数)的数据, 例如url:/cgi-bin/test.cgi?firstname=zara&lastname=ali。
你可以使用 cgi#[] 来直接获取参数firstname和lastname:
#!/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" 和 "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 方法,所以无需对两种方法区别对待。
以下是相关的hml代码:
<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>
cgi 包含了大量的方法来创建 html,每个html标签都有相对应的方法。 在使用这些方法前,比必须通过 cgi.new 来创建 cgi 对象。
为了使标签的嵌套更加的简单,这些方法将内容作为了代码块,代码块将返回字符串作为标签的内容。如下所示:
#!/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
}
}
}
}
当你在处理 url 中的参数或者 html 表单数据时,需要对指定的特殊字符进行转义,如:引号("),反斜杠(/)。
ruby cgi 对象提供了cgi.escape 和 cgi.unescape 方法来处理这些特殊字符的转义:
#!/usr/bin/ruby
require 'cgi'
puts cgi.escape(zara ali/a sweet & sour girl")
以上代码执行结果如下:
#!/usr/bin/ruby
require 'cgi'
puts cgi.escape(zara ali/a sweet & sour girl")
另一组实例:
#!/usr/bin/ruby
require 'cgi'
puts cgi.escapehtml('<h1>zara ali/a sweet & sour girl</h1>')
以上代码执行结果如下:
<h1>zara ali/a sweet & sour girl</h1>'
以下是ruby中完整的cgi类的相关方法