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


Общие сведения об API HTTP-сервера

Следующий список определяет типичную последовательность операций, использующих API HTTP-сервера:

  • Инициализировать API HTTP-сервера с помощью функции httpinitialize.
  • Создайте очередь запросов с помощью функции HttpCreateHttpHandle.
  • Зарегистрируйте один или несколько URL-адресов с помощью функции HttpAddUrl.
  • Получение входящих запросов, направленных на зарегистрированные URL-адреса , с помощью функции httpReceiveHttpRequest и отправки HTTP-ответов для этих запросов с помощью функции HttpSendHttpResponse.
  • (Необязательно) При отправке ответа используйте функцию HttpSendResponseEntityBody для отправки дополнительного тела сущности.
  • Выполните операции очистки с помощью функций HttpRemoveUrl , CloseHandle и HttpTerminate .

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

Каждое приложение создает собственную очередь запросов. Приложение получает дескриптор очереди запросов из HttpCreateHttpHandle. Он передает этот дескриптор функции HttpAddUrl, чтобы добавить URL-адрес в очередь запроса. Приложение получает уведомление о входящем запросе и извлекает его из очереди запросов путем вызова функции HttpReceiveHttpRequest с дескриптором очереди запросов. Эту функцию можно использовать для получения заголовков запроса или как заголовков, так и содержимого тела сущности. HttpReceiveHttpRequest также возвращает идентификатор запроса (RequestId) для полученного запроса, уникального для дескриптора запроса.

Заметка

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

 

Используйте функцию HttpReceiveRequestEntityBody с дескриптором очереди запросов, чтобы получить последующие части тела сущности запроса, если таковые имеются.

Заметка

API HTTP-сервера декодирует блокированные сообщения на стороне приема, но не выполняет кусковую кодировку на стороне отправки. Если фрагментирование требуется на стороне отправки, приложение должно реализовать его. Дополнительные сведения о кодировании с фрагментами см. в документе RFC 2616.

 

Используйте функцию HttpReceiveClientCertificate с приложениями, которые обслуживают URL-адреса с помощью безопасной схемы ("https"), чтобы при необходимости получить информацию о сертификате клиента.

Ответы отправляются с помощью функции HttpSendHttpResponse. Эта функция использует RequestId из соответствующего запроса для отправки ответа. Ответ можно отправить в течение времени с помощью нескольких вызовов API, вызывая функцию httpSendResponseEntityBody с идентификатором запроса из первоначально полученного запроса.

Заметка

По умолчанию httpSendHttpResponse использует microsoft-HTTPAPI/1.0 в качестве заголовка Server:. Если приложение задает заголовок сервера в ответе, это значение помещается в первую часть заголовка сервера, а затем пробел, а затем —Microsoft-HTTPAPI/1.0.

 

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

Приложения должны очиститься, выполнив следующие действия.

  • Если приложение не прослушивает или не отвечает на URL-адрес, URL-адрес удаляется с помощью функции HttpRemoveURL.
  • После завершения работы приложения с очередью запросов закройте дескриптор очереди запросов при помощи функции CloseHandle.
  • После завершения работы приложения с помощью API HTTP-сервера вызовите функцию HttpTerminate.