Ruby Web 应用程序 - CGI 编程


Ruby 是一种通用语言;它根本不能被称为网络语言。即便如此,Web 应用程序和 Web 工具总体上仍然是 Ruby 最常见的用途。

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

请花几分钟时间阅读CGI 编程教程,了解有关 CGI 编程的更多详细信息。

编写 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 脚本。

例如,如果您的网站https://www.example.com/由 Linux Web 托管提供商托管,并且您将test.cgi上传到主目录并为其授予执行权限,则可以访问https://www。 example.com/test.cgi应该返回一个 HTML 页面,显示This is a test

这里,当Web 浏览器请求test.cgi时,Web 服务器在网站上查找test.cgi ,然后使用 Ruby 解释器执行它。Ruby 脚本返回一个基本的 HTTP 标头,然后返回一个基本的 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 类可以通过两种方式访问​​ HTML 查询参数。假设我们得到的 URL 为 /cgi-bin/test.cgi?FirstName = Zara&LastName = Ali。

您可以直接使用 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"]

以下是检索所有密钥的代码 -

#!/usr/bin/ruby

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

如果表单包含多个同名字段,则相应的值将以数组形式返回到脚本。[] 访问器仅返回其中的第一个。index 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 类的表单方法可以接受方法参数,该参数将设置用于表单提交的 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 和会话

我们已经在不同的章节中解释了这两个概念。请遵循以下部分 -

虚拟主机服务器

您可以在互联网上查看以下主题,以在基于 Unix 的服务器上托管您的网站 -