Ruby Web 应用程序 - CGI 编程

Ruby 是一种通用语言; 它根本不能称为网络语言。 尽管如此,Web 应用程序和 Web 工具通常是 Ruby 最常见的用途之一。

您不仅可以用 Ruby 编写自己的 SMTP 服务器、FTP 守护程序或 Web 服务器,还可以将 Ruby 用于更常见的任务,例如 CGI 编程或作为 PHP 的替代品。


编写 CGI 脚本

最基本的 Ruby CGI 脚本如下所示 −

#!/usr/bin/ruby

puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><body>This is a test</body></html>"

如果您将此脚本称为 test.cgi 并将其上传到具有正确权限的基于 Unix 的 Web 托管服务提供商,则可以将其用作 CGI 脚本。

例如,如果您有一个由 Linux Web 托管服务提供商托管的网站 https://www.example.com/ ,并且您将 test.cgi 上传到主目录并授予它执行权限,那么访问 https://www.example.com/test.cgi 应该返回一个 HTML 页面,上面写着 < i>这是一个测试

这里,当从 Web 浏览器请求 test.cgi 时,Web 服务器会在 Web 站点上查找 test.cgi,然后使用 Ruby 解释器执行它。 Ruby 脚本返回一个基本的 HTTP 标头,然后返回一个基本的 HTML 文档。


Using 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>"

Here, you created a CGI object and used it to print the header line for you.


表单处理

使用 CGI 类可以通过两种方式访问 HTML 查询参数。 假设我们得到一个 /cgi-bin/test.cgi?FirstName = Zara&LastName = Ali 的 URL.

您可以使用 CGI#[] 直接访问参数 FirstNameLastName,如下所示 −

#!/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"]

Following is the code to retrieve all the keys −

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi.keys         # =>  ["FirstName", "LastName"]

如果表单包含多个同名字段,则对应的值将作为数组返回给脚本。 [] 访问器只返回其中的第一个。索引 params 方法的结果以获取它们。

在此示例中,假设表单具有三个名为"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 方法。 这两种不同的方法没有单独的处理方法。

可以发送正确数据的相关但基本的表单将具有如下 HTML 代码 −

<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>

创建表单和 HTML

CGI 包含大量用于创建 HTML 的方法。 您会发现每个标签都有一种方法。 为了启用这些方法,您必须通过调用 CGI.new 创建一个 CGI 对象。

为了使标签嵌套更容易,这些方法将它们的内容作为代码块。 代码块应返回一个 String,它将用作标记的内容。 例如 −

#!/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
         }
      }
   }
}

注意 − CGI 类的form 方法可以接受一个方法参数,该参数将设置用于表单提交的HTTP 方法(GET、POST 等...)。 本示例中使用的默认值是 POST。

这将产生以下结果 −

Content-Type: text/html
Content-Length: 302

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN">

<HTML>
   <HEAD>
      <TITLE>This Is a Test</TITLE>
   </HEAD>
   <BODY>
      <FORM METHOD = "post" ENCTYPE = "application/x-www-form-urlencoded">
         <HR>
         <H1>A Form: </H1>
         <TEXTAREA COLS = "70" NAME = "get_text" ROWS = "10"></TEXTAREA>
         <BR>
         <INPUT TYPE = "submit">
      </FORM>
   </BODY>
</HTML>

引用字符串

在处理 URL 和 HTML 代码时,必须小心引用某些字符。 例如,斜杠字符 ( / ) 在 URL 中具有特殊含义,因此如果它不是路径名的一部分,则必须转义

例如,URL 查询部分中的任何 / 都将被转换为字符串 %2F,并且必须被转换回 / 才能使用。 空格和 & 号也是特殊字符。 为了处理这个问题,CGI 提供了例程 CGI.escapeCGI.unescape

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

这将产生以下结果 −

Zara+Ali%2FA Sweet+%26+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 类中的有用方法

这里是与 CGI 类相关的方法列表 −

  • Ruby CGI − 与标准 CGI 库相关的方法。


Cookie 和 Sessions

我们已经在不同的部分解释了这两个概念。 请按照章节 −