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#[] 直接访问参数 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"]
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.escape 和 CGI.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>')
这将产生以下结果 −
<h1>Zara Ali/A Sweet & Sour Girl</h1>'
CGI 类中的有用方法
这里是与 CGI 类相关的方法列表 −
Ruby CGI − 与标准 CGI 库相关的方法。
Cookie 和 Sessions
我们已经在不同的部分解释了这两个概念。 请按照章节 −
Ruby CGI Cookies − 如何处理 CGI Cookie。
Ruby CGI Sessions − 如何管理 CGI Sessions 会话。