使用ruby您不仅可以编写自己的smtp服务器,ftp程序,或ruby web服务器,而且还可以使用ruby进行cgi编程。
接下来,让我们花点时间来学校ruby的cgi编辑。
编写 cgi 脚本
最脚本的 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文档。
使用 cgi.rb
ruby 可以调用 cgi 库来编写更复杂的cgi脚本。
以下代码调用了 cgi 库来创建一个脚本的cgi脚本。
#!/usr/bin/ruby require 'cgi' cgi = cgi.newputs cgi.headerputs this is a test
以下代码中,创建了cgi 对象并打印头部信息。
表单处理
使用cgi库可以通过两种方式获取表单提交(或url中的参数)的数据, 例如url:/cgi-bin/test.cgi?firstname=zara&lastname=ali。
你可以使用 cgi#[] 来直接获取参数firstname和lastname:
#!/usr/bin/ruby require 'cgi'cgi = cgi.newcgi['firstname'] # => [zara]cgi['lastname'] # => [ali]
另外一种获取表单数据的方法:
#!/usr/bin/ruby require 'cgi'cgi = cgi.newh = cgi.params # => {firstname=>[zara],lastname=>[ali]}h['firstname'] # => [zara]h['lastname'] # => [ali]
以下代码用于检索所有的键值:
#!/usr/bin/ruby require 'cgi'cgi = cgi.newcgi.keys # => [firstname, lastname]
如果表单包含了多个相同名称的字段,则该相同字段的值将保存在数组中。
以下实例中,指定表单中三个相同的字段name,值分别为 zara, huma 和 nuha:
#!/usr/bin/ruby require 'cgi'cgi = cgi.newcgi['name'] # => zaracgi.params['name'] # => [zara, huma, nuha]cgi.keys # => [name]cgi.params # => {name=>[zara, huma, nuha]}
注意:ruby 会自动判断 get 和 post 方法,所以无需对两种方法区别对待。
以下是相关的hml代码:
first name :
last name :
创建 form 表单和 html
cgi 包含了大量的方法来创建 html,每个html标签都有相对应的方法。 在使用这些方法前,比必须通过 cgi.new 来创建 cgi 对象。
为了使标签的嵌套更加的简单,这些方法将内容作为了代码块,代码块将返回字符串作为标签的内容。如下所示:
#!/usr/bin/ruby require cgicgi = 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('zara ali/a sweet & sour girl')
以上代码执行结果如下:
zara ali/a sweet & sour girl'
