English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby CGI 編程

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 架构图

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 "Content-type: text/html\n\n"
puts "<html><body>This is a test</body></html>"

Puoi mantenere questo codice nel file test.cgi, caricarlo sul server e assegnargli i permessi sufficienti per eseguirlo come script CGI.

Se l'indirizzo del tuo sito è http://www.example.com/ , puoi accedere al programma tramite http://www.example.com/test.cgi , e il risultato sarà: "This is a test.".

Dopo aver visitato l'indirizzo, il server web troverà il file test.cgi nella directory del sito e lo parserà con il parser Ruby per accedere ai documenti HTML.

Utilizzando cgi.rb

Ruby può chiamare la libreria CGI per scrivere script CGI più complessi.

Il seguente codice chiama la libreria CGI per creare uno script di CGI.

#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"

Nel seguente codice, viene creato l'oggetto CGI e vengono stampate le informazioni di intestazione.

Elaborazione del modulo

Utilizzando la libreria CGI, è possibile ottenere i dati di invio del modulo (o i parametri dell'URL) in due modi: Ad esempio, l'URL: /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali。

Puoi utilizzare CGI#[] per ottenere direttamente i parametri FirstName e LastName:

#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['FirstName'] # => ["Zara"]
cgi['LastName'] # => ["Ali"]

Un altro metodo per ottenere i dati del modulo:

#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
h = cgi.params # => {"FirstName"=>["Zara"], "LastName"=>["Ali"]}
h['FirstName'] # => ["Zara"]
h['LastName'] # => ["Ali"]

Il seguente codice viene utilizzato per cercare tutti i valori delle chiavi:

#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi.keys # => ["FirstName", "LastName"]

Se il modulo contiene più campi con lo stesso nome, i valori di questo campo identico saranno conservati in un array.

Nell'esempio seguente, è specificato tre campi "name" identici nel modulo, con valori rispettivamente "Zara", "Huma" e "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"]}

Attenzione:Ruby giudica automaticamente i metodi GET e POST, quindi non è necessario trattarli in modo diverso.

Ecco il codice HTML relativo:

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

Creazione di moduli Form e HTML

Il pacchetto CGI contiene molti metodi per creare HTML, ogni tag HTML ha un metodo corrispondente. Prima di utilizzare questi metodi, è necessario creare l'oggetto CGI con CGI.new.

Per semplificare il nesting dei tag, questi metodi considerano il contenuto come un blocco di codice, che restituisce una stringa come contenuto del tag. Ecco un esempio:

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

Escape di stringa

Quando si gestiscono i parametri di URL o i dati di un modulo HTML, è necessario eseguire l'escape dei caratteri speciali specificati, come ad esempio: virgolette ("), barra obliqua ().

L'oggetto CGI di Ruby fornisce i metodi CGI.escape e CGI.unescape per gestire l'escape di questi caratteri speciali:

#!/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>')

以上代码执行结果如下:

<h1>Zara Ali/A Sweet & Sour Girl</h1>'

CGI 类中常用的方法

以下是Ruby中完整的CGI类的相关方法

Cookies 和 Sessions