Ruby 专题
您的位置:Ruby > Ruby专题 > Ruby CGI 编程
Ruby CGI 编程
作者:--    发布时间:2019-11-20

ruby 是一门通用的语言,不仅仅是一门应用于web开发的语言,但 ruby 在web应用及web工具中的开发是最常见的。

使用ruby您不仅可以编写自己的smtp服务器,ftp程序,或ruby web服务器,而且还可以使用ruby进行cgi编程。

接下来,让我们花点时间来学校ruby的cgi编辑。


网页浏览

为了更好的了解cgi是如何工作的,我们可以从在网页上点击一个链接或url的流程:

  • 1、使用你的浏览器访问url并连接到http web 服务器。
  • 2、web服务器接收到请求信息后会解析url,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。
  • 3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。

cgi程序可以是 ruby 脚本,python 脚本,perl 脚本,shell 脚本,c 或者 c++ 程序等。


cgi架构图

cgi


web服务器支持及配置

在你进行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

编写 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.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>

创建 form 表单和 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>')

以上代码执行结果如下:

&lt;h1&gt;zara ali/a sweet & sour girl&lt;/h1&gt;'

cgi 类中常用的方法

以下是ruby中完整的cgi类的相关方法


cookies 和 sessions


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册