Поделиться через


Задачи HTTP-сервера

Как правило, задачи HTTP-сервера выполняются в определенном порядке; То есть одна задача должна быть завершена и выходные данные, полученные до начала следующей задачи.

Страница задач создается для представления примера кода о конкретных задачах, выполняемых приложением HTTP Server. Страница задачи ссылается на файл расширения C примера HTTP-сервера. При установке PSDK на диске C:\ локального компьютера полный пример приложения сервера устанавливается в C:\Program Files\Microsoft SDK\Samples\netds\http\server.

Следующий список определяет задачи HTTP-сервера:

Инициализация службы HTTP

Служба HTTP инициализируется с помощью функции HttpInitialize, а дескриптор очереди запросов создается с помощью HttpCreateHttpHandle. Сервер должен быть инициализирован перед вызовом других функций сервера. Очередь запросов должна быть создана, прежде чем служба сможет зарегистрировать URL-адреса для прослушивания входящих HTTP-запросов.

Дополнительные сведения и пример кода см. в разделе инициализациислужбы HTTP.

Регистрация URL-адресов для прослушивания

Чтобы API HTTP-сервера прослушивал входящие запросы, определенные URL-адреса регистрируются в API путем вызова функции HttpAddUrl. Входящие запросы, соответствующие этим URL-адресам, направляются в очередь запросов, указанную в этом вызове.

Дополнительные сведения и пример кода см. в разделе Регистрация URL-адресов для прослушивания.

Вызов подпрограммы для получения запроса

Функция DoReceiveRequest выделяет буфер запроса, инициализирует идентификатор запроса и запускает цикл для получения запросов.

Дополнительные сведения и пример кода см. в разделе Вызов подпрограммы для получения запроса.

Получение запроса

API HTTP-сервера предоставляет структуру запроса для хранения проанализированного входящего запроса. Эта структура выделяется приложением и инициализируется при получении входящего запроса. Приложение вызывает функцию HttpReceiveHttpRequest для получения запроса. Если буфер запроса слишком мал, чтобы получить запрос, приложение может увеличить размер буфера и вызвать HttpReceiveHttpRequest снова, чтобы получить весь запрос.

Дополнительные сведения и пример кода см. в разделе получениезапроса.

Обработка HTTP-запроса

В примере приложения показано, как обрабатывать команды HTTP GET и POST. Приложение отправляет ошибку 503 (NOT_IMPLEMENTED), если команды присутствуют в запросе, который приложение не обрабатывает.

Обратите внимание, что URL-адрес для обработки запросов — это обработанный URL-адрес, содержащийся в элементе CookedUrl структуры HTTP_REQUEST_V1. Не выполняйте необработанные URL-адреса в элементе pRawUrl, который предназначен исключительно для отслеживания и статистических целей.

Дополнительные сведения и пример кода см. в разделе ОбработкаHTTP-запроса.

Отправка HTTP-ответа

Структура ответа выделяется и инициализируется с кодом состояния и фразой причины в макросе INITIALIZE_HTTP_RESPONSE. Известный заголовок HTTP добавляется в структуру ответа в макросе ADD_KNOWN_HEADER, а тело сущности добавляется в ответ из блока данных из памяти. Функция HttpSendHttpResponse вызывается для отправки ответа. В этом примере приложение отправляет простой ответ 200 OK на запрос GET.

Дополнительные сведения и пример кода см. в разделе Отправке http-ответа.

Отправка ответа HTTP POST

Запрос POST требует больше обработки, чем запрос GET. Текст сущности запроса получается путем вызова функции HttpReceiveRequestEntityBody. Приложение отправляет ответ и текст сущности ответа в отдельных вызовах API HTTP-сервера. Заголовки ответа отправляются с помощью httpSendHttpResponse. Тело сущности отправляется в блок данных из дескриптора файла с функцией HttpSendResponseEntityBody.

Дополнительные сведения и пример кода см. в разделе Отправка ответа HTTP POST.

Очистка API HTTP-сервера

К операциям очистки ДЛЯ API HTTP-сервера относятся:

  • Удаление всех зарегистрированных URL-адресов.
  • Закрытие дескриптора в очередь запроса.
  • Завершение ресурсов, созданных API HTTP-сервера.

Приложение вызывает функцию HttpRemoveUrl для отмены регистрации URL-адресов, зарегистрированных начальной функцией httpAddUrl . Приложение также вызывает httpTerminate для каждого вызова HttpInitialize с соответствующими параметрами флага. Этот вызов завершает все ресурсы, созданные вызовом HttpInitialize.

Дополнительные сведения и пример кода см. в разделе Очистка API HTTP-сервера.