Ruby 简明教程

Ruby Web Applications - CGI Programming

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

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

请花几分钟时间参阅 CGI Programming 教程,以更详细地了解 CGI 编程。

Writing CGI Scripts

最基本的 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 时应该会返回一个显示 This is a test 的 HTML 网页。

在此,当 Web 浏览器请求 test.cgi 时,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>"

此处,您创建了一个 CGI 对象并使用它为您打印头行。

Form Processing

使用类 CGI 使您可以通过两种方式访问 HTML 查询参数。假设我们提供了一个 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"]

如果表单包含具有相同名称的多个字段,则相应的键值对将作为数组返回给脚本。[] 访问器仅返回这些值中的第一个。对 params 方法的结果进行索引用以获取所有键值对。

在此示例中,假设表单有三个名为“姓名”的字段,我们输入了三个姓名“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"]}

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

Creating Forms and HTML

CGI 包含大量用于创建 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
         }
      }
   }
}

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

Quoting Strings

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

例如,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;'

Useful Methods in CGI Class

以下列出了 CGI 类相关方法:

  1. Ruby CGI - 与标准 CGI 库相关的方法。

Cookies and Sessions

我们在不同的部分中解释了这两个概念。请遵循以下部分:

  1. Ruby CGI Cookies - 如何处理 CGI Cookie。

  2. Ruby CGI Sessions - 如何管理 CGI 会话。

Web Hosting Servers

你可以在网上查看以下主题,以在基于 Unix 的服务器上托管你的网站: