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

برمجة CGI في Ruby

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

"
puts "<html><body>This is a test</body></html>"

يمكنك حفظ هذا الكود في ملف test.cgi، ثم تحميله إلى الخادم وتأمينه بقدر كافٍ من الصلاحيات، ليتم تنفيذه كسكربت CGI.

إذا كان عنوان موقعك هو http://www.example.com/، يمكنك زيارة البرنامج عبر http://www.example.com/test.cgi، وسيكون الناتج: "This is a test.".

بعد زيارة هذا الرابط من قبل المتصفح، سيقوم الخادم Web بالبحث عن ملف test.cgi في مجلد الموقع، ثم يقوم بتحليل الكود باستخدام معالج Ruby لاستدعاء وثيقة 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 لاسترجاع بيانات التبديل المقدمة (أو المعلمات في URL) بطريقتين: على سبيل المثال، 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"]

إذا كان النموذج يحتوي على أكثر من حقول بنفس الاسم، فإن القيم لهذه الحقول ستكون محفوظة في مصفوفة.

في هذا المثال، يتم تحديد ثلاثة حقول "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 方法,所以无需对两种方法区别对待。

以下是相关的HML代码:




First Name :

Last Name : 



创建 Form 表单和 HTML

CGI 包含了大量的方法来创建 HTML,每个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
         }
      }
   }
}

字符串转义

当你在处理 URL 中的参数或者 HTML 表单数据时,需要对指定的特殊字符进行转义,如:引号("),反斜杠(/)。

Ruby CGI 对象提供了CGI.escape 和 CGI.unescape 方法来处理这些特殊字符的转义:

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

إليك طرق فئة CGI الكاملة في Ruby

الكوكي والجلسة