Книга: Программирование на языке Ruby
19.1. Программирование CGI на Ruby
Всякий, кто знаком с программированием для Web, хотя бы раз встречал аббревиатуру CGI (Common Gateway Interface — общий шлюзовой интерфейс). Спецификация CGI появилась на заре развития Web с целью обогатить взаимодействие между пользователем и Web-сервером. С тех пор были изобретены бесчисленные альтернативные технологии, но CGI все еще живет и прекрасно себя чувствует. Своим успехом и долговечностью технология CGI обязана простоте, благодаря которой программы, удовлетворяющие этой спецификации, можно без труда писать на любом языке. Спецификация определяет, как процесс Web-сервера должен передавать данные своим потомкам. По большей части взаимодействие сводится к стандартным переменным окружения и потокам ввода/вывода.
Программирование с применением CGI, да и вообще для протокола HTTP, должно учитывать отсутствие «состояния» в механизме запрос-ответ. В общем случае клиент (обычно браузер) для каждого запроса создает новое соединение и посылает по нему единственную команду HTTP. Чаще всего используются команды GET
и POST
(к смыслу этих слов мы вернемся чуть позже). Сервер посылает ответ, после чего закрывает свой конец соединения.
В следующем примере, который лишь немногим сложнее пресловутой программы «Hello, world», показано, как выполняются ввод и вывод по спецификации CGI.
def parse_query_string
inputs = Hash.new
raw = ENV['QUERY_STRING']
raw.split("&").each do |pair|
name,value = pair.split("=")
inputs[name] = value
end
inputs
end
inputs = parse_query_string
print "Content-type: text/htmlnn"
print "<HTML><BODY>"
print "<B><I>Hello</I>, #{inputs['name*]}!</B>"
print "</BODY></HTML>"
Так, обращение с помощью этой программы к URL http://mywebserver/cgi-bin/hello.cgi?name=Dali приведет к отправке браузеру сообщения «Hello, Dali!».
Мы уже упомянули, что есть два основных способа обратиться к UTL: методы GET
и POST
, определенные в протоколе HTTP. Для краткости мы предложим простые объяснения, а не строгие определения. Метод GET
обычно вызывается, когда вы щелкаете по ссылке или указываете URL непосредственно (как в предыдущем примере). Параметры передаются в строке запроса, которую CGI-программы видят как значение переменной окружения QUERY_STRING
. Метод POST
обычно применяется для отправки HTML-форм. Параметры включаются в тело сообщения и в URL не видны. CGI-программе они доставляются через стандартный поток ввода.
Предыдущий пример был предельно простым, но в менее тривиальных случаях программа быстро становится запутанной. Приходится иметь дело с различными методами HTTP, загрузкой файлов, куками, сеансами «с состоянием» и другими сложностями, которые лучше оставить библиотеке общего назначения, поддерживающей спецификацию CGI. К счастью, в Ruby имеется обширный набор классов для автоматизации рутинной работы.
Есть еще немало библиотек и инструментов, стремящихся упростить разработку в рамках CGI. К числу лучших следует отнести библиотеку ruby-web (прежнее название Narf) Патрика Мэя (Patrick May). Если вам нужно работать на низком уровне, но стандартная библиотека почему-либо не устраивает, попробуйте эту (http://ruby-web.org).
Если необходимо решение на основе шаблонов, возможно, подойдет библиотека Amrita (http://amrita.sourceforge.jp). Обратите также внимание на Cerise — сервер приложений на базе Amrita (http://cerise.rubyforge.org).
Наверное, существуют и другие библиотеки. Если вы не нашли того, что искали, среди упомянутых здесь продуктов, обратитесь к поисковой машине или задайте вопрос в конференции.
- 19.2. FastCGI
- Глава 19. Ruby и Web-приложения
- 19.1.1. Введение в библиотеку cgi.rb
- Глава 1. Обзор Ruby
- 1.1. Введение в объектно-ориентированное программирование
- 1.2. Базовый синтаксис и семантика Ruby
- 1.3. ООП в Ruby
- 1.4. Динамические аспекты Ruby
- Программирование на языке Пролог для искусственного интеллекта
- Глава 15. Программирование на VBA в Word.
- 12.5.1. Ruby и X
- 12.5.2. Ruby и wxWidgets