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

Ruby базовый учебник

Ruby продвинутый учебник

Программирование CGI с помощью Ruby

Ruby - это универсальный язык, не только применяемый для веб-разработки, но и наиболее часто используемый в разработке веб-приложений и веб-инструментов.

Используя Ruby, вы можете не только написать свой SMTP сервер, FTP программу или веб-сервер Ruby, но и использовать Ruby для программирования CGI.

Давайте уделим время изучению редактирования CGI на Ruby.

Веб-браузинг

Чтобы лучше понять, как работает CGI, рассмотрим процесс, начиная с клика по ссылке или URL на веб-странице:

  • 1. Используйте ваш браузер для доступа к URL и подключения к HTTP веб-серверу.

  • 2. После получения запроса информация о URL анализируется веб-сервером, и проверяется, существует ли запрашиваемый файл на сервере. Если файл существует, возвращается его содержимое, в противном случае возвращается сообщение об ошибке.

  • 3. Браузер принимает информацию от сервера и отображает полученные файлы или сообщения об ошибках.

CGI программы могут быть Ruby скриптами, Python скриптами, PERL скриптами, SHELL скриптами, программами C или C++ и т.д.

Схема архитектуры CGI

Поддержка и конфигурация веб-сервера

Прежде чем начать программирование CGI, убедитесь, что ваш веб-сервер поддерживает 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>

Добавьте суффикс .rb в AddHandler, чтобы можно было доступ к файлам Ruby с расширением .rb:

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

Вы можете сохранить этот код в файл test.cgi, загрузить его на сервер и предоставить ему достаточные права доступа, чтобы он мог выполняться как CGI-скрипт.

Если адрес вашего сайта http://www.example.com/, вы можете получить доступ к программе через http://www.example.com/test.cgi, результатом будет: "This is a test."。

После посещения веб-сервером веб-сайта, находящегося по адресу http://www.example.com/, веб-сервер находит файл test.cgi в каталоге сайта и запускает его через Ruby-пarsing, чтобы открыть документ 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, поэтому нет необходимости отличать эти два метода.

Вот соответствующий 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, у каждого HTML-тега есть соответствующий метод. Прежде чем использовать эти методы, необходимо создать объект CGI с помощью CGI.new.

Для того чтобы упростить nesting тегов, эти методы делают содержимое кодовым блоком, кодовый блок возвращает строку в качестве содержимого тега. Например:

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

  • CGI Ruby  - Методы, связанные с стандартной библиотекой CGI

Cookies и сессии