В этой статье в основном описывается, как обеспечить совместную работу DELPHI и Интернета. В этой статье будут подробно описаны две специализированные технологии:
WININET: создание клиентских программ FTP, HTTP и Gopher. ISAPI: расширение информационных служб Интернета, например получение информации на сервере и отображение ее в браузере.
В современном компьютерном мире огромная тенденция развития возникла благодаря интернет-стратегии Microsoft. те, кто делает
Времена CGI (Common Gateway Interface) и сторонних инструментов даже для самых простых интернет-инструментов наконец прошли. Всегда будет потребность в сложных сторонних инструментах, но теперь программисты найдут широкий спектр необходимых им интернет-инструментов, встроенных в операционную систему. Короче говоря, без дополнительных инвестиций вы можете использовать бесплатные ресурсы DELPHI:
*Разработать WEB-браузер.
* Запуск FTP, HTTP и Gopher между двумя приложениями DELPHI или приложением DELPHI и TCP.
(Протокол управления передачей) управляет TCP между серверами.
Поскольку DELPHI может легко вызывать Windows API и поддерживает OCX/ActiveX, новую стратегию Microsoft.
Эта стратегия идеально соответствовала нашему плану. Microsoft производит инструменты, а программисты DELPHI пожинают плоды!
Что в этой статье?
Эта статья состоит из трех основных частей и нескольких небольших частей, посвященных трем основным темам:
*Найдите материалы. Техническая документация, упомянутая в этой статье, доступна там и включает краткое описание аппаратного и программного обеспечения, которое вам понадобится для запуска кода из этой статьи.
*ISAPI: Как использовать ISAPI
*WININET: Как использовать WININET
В большинстве случаев разделы ISAPI и WININET в этой статье полностью независимы, и вы можете свободно выбирать порядок их чтения.
Найдите информацию, требования к аппаратному и программному обеспечению.
Вам понадобится копия Microsoft Windows NT 3.51 Server или NT 4.0 Server, к которой должна прилагаться документация Internet Information Services, поскольку вам необходимо понимать упомянутые в ней технологии. Этот документ должен быть включен в состав NT Server4.0, а пользователи NT 3.51 могут загрузить его с веб-сайта Microsoft. Для работы Windows NT минимальная конфигурация вашего компьютера должна быть 486-совместимой и иметь не менее 20 МБ памяти.
У вас должен быть другой компьютер с установленным веб-браузером. Чтобы обеспечить бесперебойную работу части ISAPI в этой статье, вторая часть
На машине должно быть установлено все программное обеспечение, поддерживающее веб-браузеры. Если на вашем компьютере установлена ОС Windows 95 или Windows NT
Тогда фрагмент кода WININET, описанный в этой статье, будет работать лучше всего. В этой технической среде можно использовать любой подходящий веб-браузер.
В версиях Delphi 2.0 и выше, выпущенных после июня 1996 года, имеются инструменты, необходимые для подключения Delphi к Интернету.
почти все ресурсы.
Если у вас не последняя версия Delphi [Примечание: здесь автор ссылается на версию 2.0 (переводчик)], то вам нужна эта статья
Специальные файлы, упомянутые в файле, все из которых доступны практически бесплатно во Всемирной паутине [Примечание: если вы используете Delphi2.0 или выше, вам не разрешено рассматривать (Переводчик)]. Все методы, упомянутые в этой статье, могут бесперебойно работать в среде Delphi 2.0, но могут работать некорректно в 16-битной среде Delphi.
Если вам необходимо скачать информацию из Всемирной паутины, ссылка: http://www.borland.com/TechInfo/delphi/i
index.html
[Примечание: его больше не существует! :-(( (Переводчик)]
Новая версия Delphi2.0 поставляется с документом WININET.PAS. Если ваша копия его не содержит, то указанную выше.
World Wide Web Node может предоставить вам это. WININET.PAS включает список переменных, функций, типов и свойств, предназначенных для расширения Microsoft Windows Internet. Это означает, что вы можете легко добавить поддержку FTP, HTTP и Gopher в свои приложения. Microsoft WININET.DLL распространяется бесплатно. Если ее нет в вашем каталоге Windows/System или Windows/System32, вы можете получить ее у Microsoft. Вот узел Всемирной паутины, где доступен файл справки окна WININET.H:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Примечание: похоже, оно больше не доступно! : -( (Переводчик)]
Вообще говоря, онлайн-домом для интернет-разработчиков Microsoft является часть INTDEV узла Microsoft.
Помимо WININET и ICP, Delphi поддерживает еще одну ключевую технологию — ISAP. Как указано в корпоративной документации Microsoft
Как описано, эта технология позволяет «писать» серверные сценарии и фильтровать сценарии, тем самым расширяя возможности Microsoft Internet Information Services и других веб-служб ISAPI.
Если вам нужно найти описание ISAPI, вы можете перейти по адресу:
http://www.microsoft.com/intdev/sdk/servapi.htm [Примечание: да благословит вас Бог! ;-) (Переводчик)]
В конце этой статьи прилагается копия ключевого документа ISAPI с именем HTTPEXT.PAS.
Пакет управления Интернетом (ICP), бесплатно выпущенный Microsoft, представляет собой набор элементов управления OCX/ActiveX, который можно использовать в Delphi.
Перетащите их в приложение (Delphi 2.0 включает эти элементы управления). Они обеспечивают немедленную поддержку при создании приложений Delphi и знают, как просматривать веб-страницы, использовать FTP, WINSOCK и другие интернет-технологии. Если ваша копия Delphi не содержит этих элементов управления, вам следует добавить эти документы в каталог Lib в каталоге, где находится Delphi, прежде чем использовать их. Документы расположены на сайте Borland INDEX.HTML по ссылке, упомянутой выше. В этой статье я не упомянул элементы управления ICP, но любой, кто интересуется этой технологией, обязательно должен подтвердить, что они у него есть.
Копия элемента управления.
Вы можете скачать файлы моего приложения Pascal с моего сайта, их имена — STRBOX.PAS и MATHBOX.PAS.
Было бы полезно часто проверять этот сайт на наличие обновлений информации, упомянутой в этой статье.
Здесь я предполагаю, что читатель знаком с Delphi и Object Pascal, а также с Интернетом, HTML,
Иметь базовое представление о браузерах и серверах Всемирной паутины.
ИСАПИ
ISAPI — это простая в использовании, но мощная технология, позволяющая расширить возможности информационных служб Интернета.
Эта технология поставляется с Windows NT 4.0 и позволяет создавать сайты WEB, FTP и GOPHER на вашем сервере. В то же время эта технология совместима с сервером WindowsNT3.51 [Примечание: относится к версии сервера, другая версия — это версия рабочей станции (переводчик)].
Раньше лучшим способом масштабирования веб-сервера было создание CGI-приложений. Это мощные инструменты, но они также
Ограничено форматом выполнения [Примечание: например, PERL интерпретируется и выполняется (транслятор)]. Когда вы отправляете CGI-запрос к серверу из браузера, приложение CGI, скорее всего, сначала будет принудительно загружено в память, что отнимет много времени. Более того, в некоторых случаях технология CGI оказывается немного сложнее в использовании.
ISAPI — это метод замены приложений CGI путем написания DLL [Примечание: программа Dynamic Link (Translator)]. Вы также можете
Через ISAPI можно писать фильтрованный текст, но в этой статье я не буду упоминать эту технологию. По сравнению с CGI, ISAPI проще в использовании, он быстрее и лучше использует системные ресурсы. В следующих пунктах я подробно объясню, почему библиотеки DLL ISAPI лучше приложений CGI:
Библиотеки ISAPI DLL расположены по тому же адресу, что и служба HTTP, поэтому они могут получить доступ к службе HTTP непосредственно с сервера. По сравнению с CGI-приложениями они могут быстрее загружаться в память; при выполнении запроса на сервере им требуется меньше времени паузы [Примечание: имеется в виду время между выполнением запроса и получением ответа от сервера (Переводчик)] Много. Это еще более важно, когда сервер находится под большой нагрузкой.
Вы можете контролировать, когда библиотеки DLL загружаются и выгружаются. Например: вы можете предварительно загружать библиотеки DLL при первом запросе;
Выгружайте библиотеки DLL приложения ISAPI, когда они не используются, чтобы освободить системные ресурсы.
Как упоминалось ранее, вы можете использовать ISAPI для записи фильтрованного текста [Примечание: обычно относится к сценариям в структуре C/S (транслятор)], подробнее
Согласно документации Microsoft, вы можете фильтровать текст через ISAPI, чтобы сделать следующее:
Схема авторизации пользователя
сжатие
шифрование
авторизоваться
Анализ трафика или другой анализ запросов (например, поиск запросов в «....etcpassWord»)
В этой статье я сосредоточусь на том, как писать библиотеки DLL, возвращающие наборы данных, или на том, как взаимодействовать с пользователями, использующими браузеры.
Установите простой контакт.
Основы ISAPI
Файл HTTPEXT.PAS содержит ключевые инструкции для использования ISAPI. Этот документ должен сопровождать
Распространена версия Delphi. Его также можно найти на сайте Borland, который прикреплен к разделу ISAPI этой статьи. Поскольку это основано на технологии NT, для применения этой технологии необходимо использовать Delphi 2.0 или более позднюю версию. Вы не можете использовать это в 16-битном редакторе.
HTTPEXT.PAS содержит интерфейс технологии ISAPI, созданный Microsoft [Примечание: относится к интерфейсу Delphi, ISAPI скомпилирован на C++.
письмо (переводчик)]. При написании Delphi пользовательский интерфейс ISAPI не предусмотрен. Я лишь опишу, как использовать существующую технологию Microsoft. Однако ISAPI слишком прост в использовании, и большинству пользователей пользовательская версия объекта Delphi не требуется.
Есть три функции, которые можно использовать в качестве входа в библиотеки DLL ISAPI. Первые две являются обязательными, а третья — необязательной.
GetExtensionVersion: проверьте минимальную версию.
HttpExtensionPROc: это точка входа в DLL, точно так же, как блок начала... конца в приложении Delphi.
TerminateExtension: это дополнительная программа, которую можно использовать в качестве потока для очистки других выделений памяти.
Когда вы создаете DLL ISAPI, вы должны ссылаться на первые две из трех функций, перечисленных выше, выполните это
Две функции являются ключевыми для всего программирования ISAPI.
Все три оператора содержат «вывод слов» — термин, используемый потому, что библиотеки DLL ISAPI расширяют службы Internet Information Services.
устройство. (Помните, что Internet Information Server относится к Microsoft Server. Если вы хотите использовать сервер NT в качестве физического веб-сервера, то это именно тот инструмент, который вам нужен. DLL-библиотеки ISAPI распространяются вместе с NT4.0 и устанавливаются при установке операционной системы. . устанавливается автоматически.)
ISAPI предоставляет стандарт, которому могут следовать производственные серверы. Например, он может использовать сложный интерфейс NSAPI Netscape.
Сжатый до соответствующего лаконичного и красивого ISAPI для работы с интерфейсом NSAPI.
Ниже приводится объявление этих двух важных функций.
функция GetExtensionVersion (вар Ver: THSE_VERSION_INFO): BOOL; stdcall;
функция HttpExtensionProc (вар ECB: TExtensionControlBlock): DWORD stdcall;
Вы просто вставляете GetExtensionVersion в свои библиотеки DLL, и все готово. Вам нужно будет внести лишь незначительные изменения, когда ISAPI выпустит новые версии для общего доступа.
функция GetExtensionVersion (var Ver: THSE_VERSION_INFO):
БООЛ; стандартный вызов;
начинать
Ver.dwExtensionVersion := $00010000 // поддержка 1.0;
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL'; // Описание
Результат: = Истина;
конец;
Параметр, передаваемый этой функции, объявлен в HTTPEXT.PAS следующим образом:
Соответствующие параметры объявлены в HTTPEXT.PAS следующим образом:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = упакованная запись
dwExtensionVersion: DWORD;
lpszExtensionDesc: массив [0..HseMaxExtDLLNameLen-1] из Char;
конец;
Константа HseMaxExtDllNameLen имеет в объявлении значение 256. Две переменные в записи являются «самообъявленными». Первая содержит номер версии ISAPI [Примечание: переменная dwExtensionVersion (Translator)], а вторая представляет собой определяемую пользователем строку, используемую для описания DLL.
При ссылке на оператор GetExtensionVersion необходимо добавить входные данные в раздел файла DPR вашей программы DLL.
внешняя часть. Когда вы пишете это заявление, вам также следует написать:
экспорт
GetExtensionVersion
HttpExtensionProc;
Именно это вы делаете при настройке функций для этих двух важных ISAPI DLL. Следующий шаг с использованием HttpExtensionProc немного сложнее, поэтому я оставлю его в отдельном разделе.
Работа с HttpExtensionProc
Оператор HttpExtensionProc является точкой входа в DLL. Его функция аналогична оператору main() в языке C или
Начало...конец части в Delphi
Вот простой пример использования оператора GetExtensionVersion.
функция HttpExtensionProc (вар ECB: TExtensionControlBlock):
ДВОРД; стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
РеСтр := ' +
'
«Привет от ISAPI
' +
';
ResStr := Формат(
'HTTP/1.0 200 ОК'#13#10+
'Тип контента: текст/html'#13#10+
'Длина контента: %d'#13#10+
'Содержимое:'#13#10#13#10'%s'
[Длина(РесСтр)
РесСтр]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
Если вы сделаете запрос к этой DLL во время просмотра, вы получите такой ответ:
Результаты тестового сервера
Привет от ISAPI
Большинство полей в теле функции тесно связаны с простым HTML-кодом, предоставляющим основную информацию. Вам также необходимо заполнить некоторые поля в TExtensionControlBlock, как показано ниже.
Обратите внимание, что в этой записи есть указатель на функцию WriteClient. Вы можете обратиться к этой функции для передачи информации.
Отправить обратно в браузер. При вызове этой функции вы используете поле ConnID в блоке TExtensionControl, упомянутом ниже. При вызове функции ConnID автоматически заполняется.
Прежде чем просмотреть код функции, позвольте мне продемонстрировать вам все упомянутые выше функции HttpExtensionProc.
Полная программа ISAPI DLL.
библиотека Исапи1;
библиотека Исапи1;
использует
Окна
SysUtils
HTTPExt;
функция GetExtensionVersion (вар Ver: THSE_VERSION_INFO): BOOL; stdcall;
начинать
Ver.dwExtensionVersion := $00010000 // Ожидается поддержка версии 1.0;
Ver.lpszExtensionDesc := 'Написано в Delphi 2.0';
Результат: = Истина;
конец;
функция HttpExtensionProc (вар ECB: TEXTENSION_CONTROL_BLOCK): DWORD;
стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
РесСтр := '
' +
'
Результаты тестового сервера
' +
'
Исапи передает привет DevRel
';
ResStr := Формат(
'HTTP/1.0 200 ОК'#13#10+
'Тип контента: текст/html'#13#10+
'Длина контента: %d'#13#10+
'Содержимое:'#13#10#13#10'%s'
[Длина(РесСтр)
РесСтр]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
экспорт
GetExtensionVersion
HttpExtensionProc;
начинать
конец.
Чтобы запустить эту программу DLL, вам следует скопировать ее в каталог сценариев на вашем NT-сервере. На моей машине NT4.0
Это выглядит следующим образом:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
В этом примере я создал каталог под названием «mystuff».
Он просто используется для хранения того, что я создал
ISAPI-библиотеки. Ваш каталог, конечно, не будет точно таким же, как на моей машине, в зависимости от местоположения вашего каталога «inetsrv» и других факторов.
Чтобы успешно вызвать эту DLL, вам следует добавить эту гиперссылку на свою HTML-страницу:
ИСАПИ Один
Когда пользователь щелкнет эту гиперссылку, будет вызвана библиотека ISAPI1 Dll, а затем отобразится строка «Привет от ISAPI».
отображается в браузере пользователя. Если вы не поместили ISAPI.DLL в каталог mystuff, вам следует изменить приведенный выше HTML-код, чтобы адаптировать его к вашей ситуации. Обратите внимание, что ваш каталог должен быть относительным к каталогу inetsrv и не должен и не может содержать каталог, в котором находится вся ваша DLL.
Вот полный HTML-скрипт вызова:
Это домашняя страница моего домашнего компьютера.
ИСАПИ Один
Обратите внимание: если вы несколько раз копируете программу ISAPI1.DLL в каталог mystuff, вам следует
Закройте порт веб-сервера World Wide Web. Это связано с тем, что при первом копировании этой DLL вы свободны от ограничений, но после этого она принадлежит серверу. Поэтому при копировании обновленной версии первой копии следует отключить службу Всемирной паутины. Вы можете использовать программу управления сетью, чтобы отключить службу World Wide Web. Эта программа должна находиться в группе Microsoft Internet Server и устанавливаться в проводнике/диспетчере программ при установке сетевых информационных служб.
Работает с TExtensionControlBlock.
Благодаря этому пункту в этой статье вы сможете создать свою первую ISAPI DLL и запустить ее в режиме онлайн на втором компьютере.
Веб-браузер вызывает его.
Остальная часть ISAPI будет более подробно рассмотрена в этой статье.
Вот более сложная часть параметров HttpExtensionProc.
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = упакованная запись
cbSize: DWORD; // = sizeof(TExtensionControlBlock)
dwVersion: DWORD // информация о версии этой спецификации;
ConnID: HCONN; // Контекст Не изменять!
dwHttpStatusCode: DWORD // Код состояния HTTP;
// информация журнала с завершающим нулем, специфичная для этой DLL расширения
lpszLogData: массив [0..HSE_LOG_BUFFER_LEN-1] символов;
лпсзМетод: PChar // REQUEST_METHOD;
lpszQueryString: PChar // QUERY_STRING;
lpszPathInfo: PChar // PATH_INFO;
lpszPathTranslated: PChar // PATH_TRANSLATED;
cbTotalBytes: DWORD // Общее количество байт от клиента;
cbAvailable: DWORD // Доступное количество байтов;
lpbData: Pointer; // указатель на cbAvailable байты
lpszContentType: PChar // Тип контента клиентских данных;
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TRreadClientProc;
СерверПоддержкаФункция: TServerSupportFunctionProc;
конец;
Обратите внимание, что эта запись содержит упомянутое выше поле ConnID и передает первый параметр WriteClient.
Первый параметр в этой записи предназначен для контроля версий. Это должен быть размер указанного TExtensionControlBlock. Если Microsoft изменит свою структуру, они смогут определить, с какой версией структуры они имеют дело, проверив размер записи. Вам никогда не понадобятся первые три поля в этой записи, они уже заполнены ISAPI, и к ним можно получить доступ, но не изменить их в вашей программе.
Вероятно, самое важное поле в этой записи — lpszQueryString, содержащее запрос от сервера.
информация. Например, предположим, что вы создали файл с именем ISAPI1.Dll. Чтобы вызвать эту DLL, вы создаете такой HREF [Примечание: формат на языке HTML (переводчик)] на странице вашего браузера:
Тест первый
Если вы хотите ответить на эту DLL, вам нужно изменить приведенную выше строку следующим образом:
Тест первый
Если фрагмент кода HTML содержит что-то вроде второй из двух строк выше, ваша DLL будет иметь параметр lpszQueryString.
Получите строку «MyQuery», обратите особое внимание на использование флага запроса, следующего за строкой запроса.
Конечно, вы можете изменить строку запроса по своему усмотрению. Например, вы можете написать:
Тест первый
В этом запросе эта DLL ответит именем сервера. При передаче этого параметра на вас не распространяются никакие ограничения. ты
Вы можете передавать все, что захотите, и вам решать, как вы хотите анализировать информацию в DLL.
Когда вы возвращаете информацию с сервера в браузер, вы используете указатель функции «WriteClient» в этой записи.
. Вам не нужно ничего делать при инициализации этого указателя; он автоматически передается вам сервером сетевой информации.
Авторы приложений CGI заметят, что синтаксис передачи строк запроса очень знаком. Фактически, ISAPI последовал за CGI.
Как и в большинстве соглашений, большинство полей в TExtensionControlBlock можно просто позаимствовать с помощью технологии CGI.
Еще одним ключевым полем в TExtensionControlBlock является lpbData, которое содержит дополнительную информацию, загруженную вам при просмотре.
Например, если у вас есть HTML-форма с несколькими полями, информация, содержащаяся в этих полях, будет называться «
lpData». Следующий раздел этой статьи «Получение информации с помощью кнопки «ОК»» будет посвящен тому, как справиться с этой ситуацией.
На данный момент я представил четыре ключевых поля в TExtensionControlBlock:
WriteClient: указатель, позволяющий передавать отформатированные данные HTML в браузер. Эта функция используется
Поле ConnID TExtensionControlBlock.
lpszQueryString: запрос, поступающий от браузера.
lpbData: дополнительные данные, загружаемые вам из браузера. Обычно содержимое любого поля в HTML-форме.
. Я расскажу об этом подробнее в разделе «Кнопка подтверждения».
Чтобы понять, как работают другие поля в TExtensionControlBlock, лучше всего
Просмотрите и сравните их. Другими словами, вам понадобится создать HTML-страницу, которая позволит пользователю вызывать клиентскую библиотеку ISAPI DLL. Целью этой библиотеки DLL ISAPI является простое форматирование каждого поля в TExtensionControlBlock в HTML и последующая передача их обратно в браузер. Это превращает ваш браузер в несколько устрашающий отладчик, отображающий все поля TExtensionControlBlock.
Вот программа, написанная Дэнни Торпом из Borland, которая выполняет эту задачу:
библиотека test1;
использует
Окна
SysUtils
HTTPExt;
функция GetExtensionVersion (вар Ver: THSE_VERSION_INFO): BOOL; stdcall;
начинать
Ver.dwExtensionVersion := $00010000 // поддержка 1.0;
Ver.lpszExtensionDesc := 'Тестовая DLL, написанная на Delphi 2.0';
Результат: = Истина;
конец;
функция HttpExtensionProc (вар ECB: TEXTENSION_CONTROL_BLOCK):
ДВОРД; стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
Buf: массив [0..1024] символов;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
ResStr := Формат(
' +
'
'Размер = %d
'+
'Версия = %.8x
'+
'ConnID = %.8x
'+
'Метод = %s
' +
'Запрос = %s
' +
'PathInfo = %s
'+
'PathTranslated = %s
'+
'TotalBytes = %d
'+
'Доступные байты = %d
'+
'Тип контента = %s
'+
'
[ECB.cbSize
ECB.dwVersion
ЕЦБ.ConnID
ECB.lpszМетод
ECB.lpszQueryString
ЕЦБ.lpszPathInfo
ECB.lpszPathПереведено
ECB.cbTotalBytes
ECB.cbДоступен
ЕЦБ.lpszContentType]);
с ЕЦБ сделать
начинать
StrLen := Sizeof(Buf);
GetServerVariable(ConnID
'REMOTE_ADDR'
@Буф
СтрЛен);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'REMOTE_HOST'
@Буф
СтрЛен);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'REMOTE_USER'
@Буф
СтрЛен);
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'SERVER_NAME'
@Буф
СтрЛен);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'СЕРВЕР_ПОРТ'
@Буф
СтрЛен);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'СЕРВЕР_ПРОТОКОЛ'
@Буф
СтрЛен);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'СЕРВЕР_ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ'
@Буф
СтрЛен);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'ThreadID = %.8x
'
[РесСтр
Буф
GetCurrentThreadID]);
конец;
ResStr := ResStr + ';
ResStr := Формат(
'HTTP/1.0 200 ОК'#13#10+
'Тип контента: текст/html'#13#10+
'Длина контента: %d'#13#10+
'Содержимое:'#13#10#13#10'%s'
[Длина(РесСтр)
РесСтр]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
экспорт
GetExtensionVersion
HttpExtensionProc;
начинать
конец.
Чтобы вызвать эту DLL, вам необходимо создать сценарий HRML, который включает следующую строку:
Тест первый
Получите информацию с помощью кнопки «Подтвердить»
Обычно HTML-формы, отправляющие вам информацию, имеют кнопку подтверждения. Если объем информации меньше 49 КБ, вы можете
Считайте, что поле lpbData в TExetensionControlBlock доступно. Вот как вы можете
В большинстве случаев информация, отправленная указателем на это поле, получается:
вар
С: строка;
начинать
…
S := PChar(ECB.lpbData);
…
конец;
Если информация, поступающая из этого поля, превышает 48 КБ, вам необходимо вызвать ReadClient, чтобы получить оставшуюся информацию.
Если вы хотите точно знать, какая информация доступна в поле lpbData, вы можете использовать следующие две функции для передачи данных обратно в ваш веб-браузер:
функция SetUpResString: строка;
начинать
Результат := ' +
' +
'
'lpbData = %s ' +
';
конец;
функция HttpExtensionProc (вар ECB: TExtensionControlBlock):
ДВОРД; стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
С
S1: строка;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Формат(ResStr
[С]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
Предположим, у вас уже есть HTML-форма со следующим прикрепленным кодом:
Этот код создаст форму с текстовой областью для ввода чисел и кнопкой «Отправить» под названием «GetSquare». Если у вас есть эта форма, то вы можете ожидать, что две вышеуказанные программы вернут следующую строку, при условии, что пользователь вводит число 23 в текстовую область формы:
lpbData = GetSquare=23&GetSquare=Отправить
Чтобы понять, что происходит в это время, обратите внимание на основную часть оператора HTML, взятую из приведенной выше функции. Эта часть оператора находится на сервере и отображается следующим образом:
'lpbData = %s ' +
Если вы изучите код функции HttpExtensionProc выше, вы обнаружите, что непосредственно перед этим предложением он использует параметр %s в операторе Format вместо значения в ECB.lpbData. (Если вы не знаете, как работает оператор Format, обратитесь к соответствующей документации Delphi.) [Примечание: в Энциклопедии программирования Delphi2 автора (Delphi2
Подробные инструкции есть в главе 3 «Строки и текстовые файлы» в Unleashed (Переводчик)]
Предположим, что в форме, показанной выше, когда пользователь нажимает кнопку «Подтвердить», значение, передаваемое lpbData в DLL ISAPI, равно:
GetSquare=23&GetSquare=Отправить
Чтобы дать вам ясное представление, позвольте мне повторить, что информация, передаваемая обратно в браузер двумя приведенными выше операторами, представляет собой следующую строку, которую вы уже видели:
lpbData = GetSquare=23&GetSquare=Отправить
Лучший способ увидеть этот процесс — протестировать программу ISAPI2, указанную ниже. ISAPI2 похож на ISAPI1, но включает новую функцию HttpExtensionProc, показанную выше, а также служебную функцию SetUpResString.
библиотека Исапи2;
использует
Окна
SysUtils
HTTPExt;
функция GetExtensionVersion (var Ver: THSE_VERSION_INFO):
БООЛ; стандартный вызов;
начинать
Ver.dwExtensionVersion := $00010000 // поддержка 1.0;
Ver.lpszExtensionDesc := 'DLL, написанная на Delphi 2.0';
Результат: = Истина;
конец;
функция SetUpResString: строка;
начинать
Результат := ' +
' +
'
'lpbData = %s ' +
';
конец;
функция HttpExtensionProc (вар ECB: TEXTENSION_CONTROL_BLOCK):
ДВОРД; стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
С
S1: строка;
Лен: целое число;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Формат(ResStr
[С]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
экспорт
GetExtensionVersion
HttpExtensionProc;
начинать
конец.
Получив информацию, переданную переменной lpbData из формы, вы можете проанализировать ее или вернуть ее пользователю. Например, вы можете извлечь число 23 из приведенного выше примера, возвести его в квадрат и вернуть пользователю. Это позволяет вам получать информацию от пользователя, в данном случае числа, выполнять некоторые математические операции с числами и, наконец, возвращать результат пользователю. Это означает, что вы можете создавать интерактивные веб-страницы прямо в эфире, что сейчас является самым популярным аспектом интернет-программирования!
Ниже приведен полный программный код, который передает квадрат числа в браузер по сети:
библиотека Исапи3;
{ Этот код показывает, как получать данные от пользователя через браузер
проанализировать эту информацию
а затем вернуть ответ пользователю, в частности.
пользователь отправляет номер
этот код исправляет это
а затем отправляет результат обратно пользователю. Вот форма из браузера, которая отправляет информацию для анализа:
}
использует
Окна
SysUtils
HTTPExt
СтрБокс;
функция GetExtensionVersion (var Ver: THSE_VERSION_INFO):
БООЛ; стандартный вызов;
начинать
Ver.dwExtensionVersion := $00010000 // поддержка версии 1.0;
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Результат: = Истина;
конец;
// Анализируем lpbData и получаем число, переданное нам пользователем.
функция ParseData(S: string): Integer;
начинать
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Результат: = StrToInt(S);
конец;
функция SetUpResString: строка;
начинать
Результат := ' +
' +
'
'Ответ = %d ' +
';
конец;
функция HttpExtensionProc (вар ECB: TEXTENSION_CONTROL_BLOCK):
ДВОРД; стандартный вызов;
вар
РеСтр: строка;
СтрЛен: Целое число;
С
S1: строка;
Число: целое число;
начинать
ECB.lpszLogData := 'Журнал Delphi DLL';
ECB.dwHTTPStatusCode: = 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Число := ParseData(S);
Число := Квадрат(Число);
ResStr := Формат(ResStr
[Число]);
StrLen := Длина(ResStr);
ECB.WriteClient(ECB.ConnID
Указатель(ResStr)
СтрЛен
0);
Результат: = HSE_STATUS_SUCCESS;
конец;
экспорт
GetExtensionVersion
HttpExtensionProc;
начинать
конец.
Этот код принимает следующую строку от пользователя, который нажал кнопку подтверждения и запросил квадрат числа:
GetSquare=5&GetSquare=Отправить
При таком вводе этот код вернет пользователю через Интернет следующую строку:
Ответ = 25
В одном предложении пользователь вводит число 5, а вы возвращаете пользователю число 25. Если пользователь отправляет число 10, вы возвращаете число 100. Это может показаться тривиальным, но здесь важно то, что происходит в Интернете. [Примечание: речь идет об интерактивных веб-страницах (переведенных
ВОЗ)]
Проанализируйте функцию, переданную пользователем, следующим образом:
// Анализируем lpbData и получаем число, переданное нам пользователем.
функция ParseData(S: string): Integer;
начинать
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Результат: = StrToInt(S);
конец;
Эти два утверждения находятся в блоке, упомянутом в начале этой статьи, а также размещены на моем сайте. [Примечание: этот документ можно найти практически везде в Интернете.
Вы также можете запросить его у переводчика (Переводчик)][В этой статье
Я просто так хочу поговорить об ISAPI. Этого должно быть достаточно, чтобы вдохновить вас весело провести время, используя эту замечательную технологию. Далее я хочу поговорить о двух операторах GetServerVariable и ReadClient. В этом отношении я проводил лишь крайне ограниченные эксперименты. К этой статье я приложил файл HTTPEXT.PAS, потому что вы не найдете его больше нигде, кроме этого важного документа.
Операторы GetServerVariable и ReadClient
Точно так же, как запрос информации в вашем приложении CGI, вы можете использовать операторы для получения информации с сервера. Вот пример вызова этого оператора:
Лен := HseMaxExtDllNameLen;
SetLength(S1
Лен);
Дек(Лен);
ECB.GetServerVariable(ECB.ConnID
"CONTENT_LENGTH"
Пчар(S1)
Лен);
Во-первых, этот код устанавливает длину буфера, в котором хранится информация, полученная с сервера. Затем он вызывает сервер и делает запрос, в данном случае он запрашивает «CONTENT_LENGTH» сообщения с сервера.
В документации Microsoft указано, что вы можете передать следующую строку в качестве второго параметра GetServerVariable:
AUTH_TYPE Содержит тип используемой авторизации. Например, если вы используете базовую авторизацию, то
Строка является «базовой»; если это ответ на запрос NT, это строка «NTLM». Другие полномочия имеют определенные соответствующие строки. Поскольку на сервер постоянно добавляются новые типы авторизации, перечислить все возможные строки невозможно. Если строка пуста, авторизация не используется.
CONTENT_LENGTH Число байтов, которые сценарий ожидает получить от клиента.
CONTENT_TYPE Тип контента информации, предоставляемой телом рекламного запроса. [Примечание: младший брат менее талантлив и менее осведомлен,
POST-запрос временно переводится как «уведомление о запросе», поправьте меня (переводчик)]
PATH_INFO Дополнительная информация о маршрутизации, предоставляемая клиентом. Он содержит путь к URL-адресу после имени сценария.
Зависит от. Если присутствует, это предшествует строке запроса.
PATH_TRANSLATED Это значение PATH_INFO, но содержит имена всех виртуальных маршрутов, расширенных на флаг пути.
Query_String Информация после "?"
Remote_addr IP -адрес запрошенного клиента или его агента (например, шлюз или брандмауэр).
Remote_host Имя хоста запрашивающего клиента или его агента (например, шлюз или брандмауэр).
Remote_user Это содержит имя пользователя, предоставленное клиентом и авторизованное сервером. Если пустая строка возвращается, то пользователь
На ваше имя (но с разрешением).
Unmapped_remote_user Это имя пользователя со следующими характеристиками: этот пользователь делает запрос в учетную запись пользователя NT (это его личность), в котором фильтр приложения ISAPI отобразил пользователя.
Request_method - это метод HTTP -запроса.
Script_name Имя выполненного скрипта.
Server_name Имя хоста или IP-адрес, когда оно появляется в самореференциальных URL-адресах.
Server_port Порт TCP/IP, который принимает запросы.
Server_port_secure строка, которая составляет 0 или 1. Это 1, когда запрос обрабатывается безопасным портом;
Server_protocol принимает имя и версию информации протокола, связанной с этим запросом. Обычно это http/1.0.
Server_software - это имя и версия веб -сервера, где работает программа DLL приложения ISAPI. All_http Предыдущая переменная не разрабатывала все заголовки HTTP. Эти переменные получены из HTTP_ <Имя заголовка поля>. Полевые заголовки (разделенные линейными маркерами) содержат отдельные строки, которые не прекращаются.
HTTP_ACCECTE Специальный случай заголовка HTTP. Принятые значения: поля, разделенные запятыми (,). Например: если
Следующие строки являются частью заголовка HTTP:
Принять: */ *, Q = 0,1
Затем URL (новая функция в версии 2.0) дает свою основную часть.
Обратите внимание, что информация, приведенная выше, автоматически передается записи TextensionControllock. потому что
Вам не нужно называть GetserverVariable для этого. Тем не менее, вы можете позвонить в него, если вам это действительно нужно, особенно если вы хотите получить информацию от ReadClient и вам нужно знать, сколько информации для чтения.
Много раз вам не нужно звонить в RideClient. Тем не менее, размер сообщения, отправленного вашим браузером, превышает 48 КБ
Время, вам нужно позвонить в ReadClient, чтобы получить оставшуюся информацию.