Установка библиотеки VFPCGI в системе
Все очень легко. Просто скопируйте библиотеку VFPCGI.DLL в системную папку.
Это \Windows\system для Windows 9x и \WinNT\system32 для
NT/2000. Не надо регистрировать ее в системе. Все готово к работе. Создавайте
ваш EXE-файл на FoxPro, копируйте его в каталог для скриптов Вашего
web-сервера и запускайте.
Взаимодействие
CGI и web-сервера
Предварительно несколько слов о способах передачи данных между web-сервером
и CGI программой. Если Вы хорошо знакомы с этим механизмом, можете пропустить
этот подраздел и перейти к методике написания CGI
c VFPCGI.DLL
Когда Вы описываете форму в
HTML, то в тэге <form action=...> обычно указываете метод передачи
запроса от browser к web-серверу: GET или POST. Web-сервер
в свою очередь сообщает запускаемой им программе какой именно метод передачи
затребовал клиент. В случае использования метода GET все параметры
передаются web-сервером через переменные окружения. Количество и тип параметров
зависят от типа запроса, но для разных web-серверов имеются и специфичные
параметры. Чтобы самостоятельно выяснить какие параметры формирует конкретно
Ваш web-сервер, можете в Visual C++ сделать такую маленькую программку
под названием cgitest:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
char **envptr;
envptr = environ;
printf("Content-type:
text/html\n\n");
while ( NULL
!= *envptr )
{
printf("<br>");
printf("%s",*envptr);
envptr++;
}
return 0;
}
Если у
Вас не установлен C++ или Вы испытываете к нему неприязнь, то можете просто
скачать
.exe файл этой программки.
Теперь,
указав в форме например
<form action="http://localhost/scripts/cgitest.exe">
Вы можете абсолютно точно узнать какие
именно переменные окружения создает и передает CGI программе установленный
у Вас web-сервер конкретно для этой формы. Теперь, создавая скрипт
на VFP, Вы можете читать эти данные функцией GETENV ( ) и нормально
их обрабатывать.
Есть и
стандартные для всех серверов переменные
окружения. Например, функция
GETENV("REQUEST_METHOD")
возвращает символьную строку с указанием используемого метода передачи
данных формы: GET или POST, GETENV("QUERY_STRING") возвращает кодированную
строку запроса метода GET, и так далее.
Методика написания
CGI
Библиотека VFPCGI.DLL экспортирует для CGI программ всего три функции,
которые должны быть объявлены в Вашем скрипте:
declare
integer wwwWrite in vfpcgi.dll string,integer
declare integer wwwRead in vfpcgi.dll
string,integer
declare integer wwwDecode in vfpcgi.dll
string
Назначение
этих функций:
wwwWrite
пишет из CGI программы для web-сервера строку символов для
передачи клиенту. То есть эта функция по сути возвращает результат работы
скрипта. Параметры: символьная строка, длина строки. Возвращает всегда
число 0.
Пример:
wwwWrite("<h1>Hello,world
!</h1>",22)
Замечание. Эта функция может вызываться скриптом многократно, если
Вам удобнее передавать результаты выполнения скрипта по частям (например,
если данные имеют очень большой объем и Вы хотите, чтобы пользователь не
ждал завершения работы программы, а начинал получать данные последовательно,
но сразу). Однако всегда первой должна передаваться стандартная
строка для броузера, содержащая тип MIME передаваемых данных, например:
htmlHeader="Content-type:
text/html" + chr(10) +chr(10)
wwwWrite(htmlHeader,len(htmlHeader))
указывает, что скрипт генерирует
обычный гипертекстовый документ. Вместо text/html
Вы должны указать, например, image/gif,
если Ваш скрипт возвращает картинку баннера в формате GIF и т.д.
wwwRead
позволяет CGI программе
читать данные, переданные web-серверу из формы методом POST. Функция
работает почти аналогично обычной функции FREAD ( ), то есть буфер чтения
должен быть заранее объявлен и его адрес передается по ссылке. Отличие
от FREAD - буфер должен быть проинициализирован на полную длину , и функция
всегда возвращает 0.
Пример:
if
GETENV("REQUEST_METHOD") = "POST"
Buffer = space(val(getenv("CONTENT_LENGTH")))
wwwRead(@Buffer,len(Buffer))
endif
В этом
примере данные, передаваемые методом POST, читаются в переменную Buffer.
Длина данных при использовании метода POST всегда определена переменной
окружения CONTENT_LENGTH.
wwwDecode
декодирует данные формы, переданные методом GET. То есть позволяет превратить
строку вида %D2%F3%F2+%E1%FB%EB+%C2%E0%F1%FF
в написанное в форме Тут был Вася.
Функции
передается один параметр: ссылка на строку кодированных данных запроса,
возвращается длина декодированной строки.
Пример:
if
GETENV("REQUEST_METHOD") = "GET"
Buffer = GETENV("QUERY_STRING")
nLen = wwwDecode(@Buffer)
Buffer = substr(Buffer,1,nLen)
endif
В этом
примере данные, передаваемые методом GET, читаются в переменную Buffer.
Обратите внимание, что после декодирования FoxPro сам не определяет, что
длина строки изменилась, поэтому надо использовать SUBSTR.
Подводя итоги
В заключение, самый простой пример CGI скрипта, написанный с использованием
VFPCGI.DLL :
procedure
Hello
declare integer wwwWrite in vfpcgi.dll
string,integer
htmlHeader="Content-type: text/html"
+ chr(10) +chr(10)
wwwWrite(htmlHeader,len(htmlHeader))
wwwWrite("<h1>Hello,world !</h1>",22)
clear dlls