Передача параметров серверному обработчику
Файл pass_parameter.srf показывает, как можно передавать параметры методу замены обработчика запросов Web-приложения (pass parameter как раз и означает "передать параметр"). Класс обработчика запросов с помощью функций грамматического разбора преобразует первоначальные параметры, указанные в .srf-файле и имеющие строковый тип (string), в тот тип данных, который требуется методу обработчика запросов. В классе обработчика запросов сигнатура такого рода функции должна выглядеть следующим образом:
HTTP_CODE parSeFunction( IAtlMemMgr* pMemoryManager, LPCSTR szArgumentData, parameterType** ppArgument);
Память, используемая для хранения преобразованного параметра, должна быть размещена с помощью pMemoryManager › Allocate (memory manager – "диспетчер памяти", allocate – "разместить"). Эту память не надо освобождать явным образом, потому что в нужное время она автоматически освобождается каркасом ATL Server. Исходные строковые (типа string) данные, передаваемые через параметр, выбираются из szArgumentData (данные аргумента). Преобразованный параметр передается методу обработчика запросов и затем сохраняется с помощью ppArgument (argument– "аргумент"). Для параметра вы можете определить свой собственный тип данных с помощью какой-либо структуры или использовать типы данных, указанные ниже.
- bool (логический, булев);
- char (символ);
- unsigned char (символ без знака);
- short (короткий);
- unsigned short (короткий без знака);
- int;
- unsigned int (int без знака);
- _int64;
- unsigned_int64(_int64 без знака);
- double (с удвоенной точностью);
- float (с плавающей точкой).
Затем, как показано в следующей сигнатуре, аргумент принимается из класса обработки запросов соответствующим методом замены:
HTTP_CODE replacementMethod( parameterType* pArgument);
Параметр pArgument должен указывать на тот тип данных, который используется в соответствующей функции грамматического разбора.
Связывать друг с другом метод замены и соответствующую ему функцию грамматического разбора можно с помощью одного из двух приемов. В соответствии с первым из них, если parameterType (тип параметра) является одним из типов, поддерживаемых для атрибута tag_name, то имя функции грамматического разбора можно пропускать, и она будет автоматически связываться с методом замены в результате учета типа.
Ну, а в соответствии со вторым приемом имя функции грамматического разбора, связываемой с методом замены, можно указывать явно в параметре parse_func (функция грамматического разбора) атрибута tag_name. Такой прием необходимо использовать тогда, когда вы с помощью какой-либо структуры определяете свой собственный тип параметра или имеются разные методы, которые принимают один и тот же тип параметра.
В следующем примере показана передача параметров из соответствующего файла pars_parameter.srf. Передача параметров выполняется с помощью первого из двух указанных приемов. В примере можно видеть, что передача параметра требует как функции грамматического разбора, так и метода замены.
Функция должна преобразовывать параметр из строкового типа в тот, который нужен (в данном примере это int). Что касается метода замены, то он должен принимать преобразованный параметр и управлять заменой дескрипторов.
// Обработчик для проверки передачи параметров [request_handler("pass_parameter")] class C_parameter_passing_ATLServerAppHandler { protected: // защищенный // метод синтаксического анализа преобразовывает // параметр из строки в int HTTP_CODE parseFunction( IAtlMemMgr* pMemoryManager, LPCSTR szArgumentData, int** ppArgument) { // распределить память для передаваемого параметра int *pparam = (int *)pMemoryManager › Allocate(sizeof(int)); // Распределить // установить значение параметра, передаваемого // методу замены *pparam = atoi(szArgumentData); // передать параметр обратно через ppArgument ppArgument = &pparam; return HTTP_SUCCESS; } // метод замены принимает параметр типа int [ tag_name(name="SquareOfParameter") ] HTTP_CODE SquareOfParameter(int* pArgument) { m_HttpResponse << "Parameter was " // Параметр был << *pArgument << "<p>" << "Square of parameter is" // Квадрат параметра << *pArgument * *pArgument; return HTTP_SUCCESS; } };