Обработка форм
В данном примере к ATLserverApp.h добавляется класс обработчика запросов, называемый C_process_post_AppHandler. В этом классе имеется метод ProcessPost, который получает доступ к переменной, переданной из формы с помощью объекта HTTP-запроса. Коллекцию CHttpRequestParams можно получить из метода CHttpRequest::GetFormVars. Затем для получения из формы значения с определенным именем используется метод CHttpRequestParams:: Exchange. В нашем примере таким именем значения является "txtName". Значение, содержащееся в szName, мы будем передавать назад клиенту – всего лишь для доказательства того, что этот метод работает.
// Обработчик (handler), который обрабатывает POST [request_handler("process_post")] class C_process_post_AppHandler { protected: // защищенный [ tag_name(name="ProcessPost") ] HTTP_CODE ProcessPost(void) { // использовать переменную формы const CHttpRequestParams &request = // константа m_HttpRequest.GetFormVars(); CValidateContext valCtx; LPCSTR szName; request.Exchange("txtName", SszName, fivalCtx); // запрос. // Обмен m_HttpResponse << "Welcome to ATL Server, " << szName << "<p>"; // << "Добро пожаловать в ATL Server, " return HTTP_SUCCESS; } };
Вот файл process_post.srf, который предоставляет доступ к только что описанному методу ProcessPost:
{{handler ATLServerApp.dll/process_post}} {{ProcessPost}}
На этот раз непосредственного доступа к process_post.srf через браузер не будет. Доступ теперь возможен через другой, HTML-файл, содержащий форму. Второй файл [При создании решения в среде Visual Studio html-файл автоматически копируется в виртуальный каталог размещения вместе с srf-файлами.] называется SimpleForm.html и содержит следующий HTML-код. Обратите внимание, что этот HTML-код регистрирует запрос, содержащий значение с именем "txtName".
<HTML> <HEAD> </HEAD> <BODY> <! – ТЕЛО – > <form method="post" <! – метод – > action= <! – действие – > "http://localhost/ATLServerApp/process_post.srf"> Enter your name: <! – Введите ваше имя – > <input name="txtName" type="text" size="30"> <! – имя = "txtName" тип = "текстовый" размер = "30" – > <input name="cmdEcho" type="submit" value="Echo"> <! – входное имя = "cmdEcho" тип = "представить" значение = // "Echo" – > </form> </BODY> <! – тело – > </HTML>
И опять же, будет полезно, используя отладчик, понаблюдать, что происходит внутри динамически подключаемой библиотеки (DLL) расширения интерфейса прикладного программирования Internet-сервера (ISAPI). Вы увидите, что функция HttpExtension-Proc из ATLServerAppIsapi.dll принимает параметр EXTENSION_CONTROL_BLOCK, который содержит данные, перечисленные в табл. 12.2. Содержимое этих элементов берется из формы, определяемой в показанном выше файле SimpleForm.html.
В этом примере SimpleForm.html использует метод POST (ЗАПИСАТЬ), и данные переносятся в тело запроса. В классе обработчика доступ к этим данным выполняется с помощью массива FormVars (Переменные формы). Если файл SimpleForm.html был изменен для использования метода GET (ПОЛУЧИТЬ), тогда в строке запроса должны находиться данные [В элементе FORM (ФОРМА) атрибут метода может указывать один из двух методов отправки данных формы на Web-сервер, а именно GET (ПОЛУЧИТЬ) или POST (ЗАПИСАТЬ). Первый из них в конце универсального идентификатора ресурса (URI), указанного атрибутом действия элемента FORM (ФОРМА), вставляет знак вопроса, а затем – данные формы. Метод POST (ЗАПИСАТЬ) помещает эти данные в тело HTTP-запроса ]. Впрочем, массив FormVars также можно использовать для доступа к данным формы. В табл. 12.3 показаны значения параметра EXTENSION_ CONTROL_BLOCK в том случае, если бы элемент FORM (ФОРМА) был изменен для использования метода GET (ПОЛУЧИТЬ).