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


Функция WinHttpReceiveResponse (winhttp.h)

Функция WinHttpReceiveResponse ожидает получения ответа на HTTP-запрос, инициированный WinHttpSendRequest. Когда winHttpReceiveResponse успешно завершается, код состояния и заголовки ответа получены и доступны приложению для проверки с помощью WinHttpQueryHeaders. Приложение должно вызвать WinHttpReceiveResponse , прежде чем оно сможет использовать WinHttpQueryDataAvailable и WinHttpReadData для доступа к тексту сущности ответа (если таковой имеется).

Синтаксис

WINHTTPAPI BOOL WinHttpReceiveResponse(
  [in] HINTERNET hRequest,
  [in] LPVOID    lpReserved
);

Параметры

[in] hRequest

Дескриптор HINTERNET , возвращенный WinHttpOpenRequest и отправленный WinHttpSendRequest. Дождитесь завершения winHttpSendRequest для этого дескриптора, прежде чем вызывать WinHttpReceiveResponse.

[in] lpReserved

Этот параметр зарезервирован и должен иметь значение NULL.

Возвращаемое значение

Возвращает значение TRUE в случае успешного выполнения или FALSE в противном случае. Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError. Среди возвращаемых кодов ошибок приведены следующие.

Код ошибки Описание
ERROR_WINHTTP_CANNOT_CONNECT
Возвращается при сбое подключения к серверу.
ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW
Возвращается при обнаружении условия переполнения в процессе анализа фрагментированного кодирования.
ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED
Возвращается, когда сервер запрашивает проверку подлинности клиента.
ERROR_WINHTTP_CONNECTION_ERROR
Подключение к серверу было сброшено или прервано, или обнаружен несовместимый протокол SSL. Например, WinHTTP версии 5.1 не поддерживает SSL2, если только клиент специально не включает его.
ERROR_WINHTTP_HEADER_COUNT_EXCEEDED
Возвращается, когда в ответе было больше заголовков, чем может получить WinHTTP.
ERROR_WINHTTP_HEADER_SIZE_OVERFLOW
Возвращается WinHttpReceiveResponse , когда размер полученных заголовков превышает ограничение для дескриптора запроса.
ERROR_WINHTTP_INCORRECT_HANDLE_STATE
Запрошенная операция не может быть выполнена, так как предоставленный дескриптор находится в неправильном состоянии.
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
Для этой операции указан неправильный тип дескриптора.
ERROR_WINHTTP_INTERNAL_ERROR
Произошла внутренняя ошибка.
ERROR_WINHTTP_INVALID_SERVER_RESPONSE
Не удалось проанализировать ответ сервера.
ERROR_WINHTTP_INVALID_URL
Недопустимый URL-адрес.
ERROR_WINHTTP_LOGIN_FAILURE
Попытка входа завершилась сбоем. При обнаружении этой ошибки дескриптор запроса должен быть закрыт с помощью WinHttpCloseHandle. Перед повтором функции, которая изначально вызвала эту ошибку, необходимо создать новый дескриптор запроса.
ERROR_WINHTTP_NAME_NOT_RESOLVED
Не удалось разрешить имя сервера.
ERROR_WINHTTP_OPERATION_CANCELLED
Операция была отменена, как правило, из-за того, что дескриптор, с которым работал запрос, был закрыт до завершения операции.
ERROR_WINHTTP_REDIRECT_FAILED
Сбой перенаправления из-за изменения схемы или неудачи всех попыток перенаправления (по умолчанию — пять попыток).
ERROR_WINHTTP_RESEND_REQUEST
Сбой функции WinHTTP. Требуемую функцию можно повторно выполнить в том же дескрипторове запроса.
ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW
Возвращается, когда входящий ответ превышает внутренний предел размера WinHTTP.
ERROR_WINHTTP_SECURE_FAILURE
В SSL-сертификате, отправленном сервером, обнаружена одна или несколько ошибок. Чтобы определить тип ошибки, проверка WINHTTP_CALLBACK_STATUS_SECURE_FAILURE уведомление в функции обратного вызова состояния. Дополнительные сведения см. в разделе WINHTTP_STATUS_CALLBACK.
ERROR_WINHTTP_TIMEOUT
Истекло время ожидания запроса.
ERROR_WINHTTP_UNRECOGNIZED_SCHEME
URL-адрес указывает схему, отличаемую от "http:" или "https:".
ERROR_NOT_ENOUGH_MEMORY
Недостаточно памяти для выполнения запрошенной операции. (Код ошибки Windows)

Комментарии

Даже если WinHTTP используется в асинхронном режиме (то есть, когда WINHTTP_FLAG_ASYNC задано в WinHttpOpen), эта функция может работать как синхронно, так и асинхронно. Если эта функция возвращает значение FALSE, эта функция завершилась сбоем, и вы можете вызвать GetLastError , чтобы получить расширенные сведения об ошибке. Если эта функция возвращает значение TRUE, приложение должно ожидать либо обратный вызов завершения WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE , указывающий на успешное выполнение, либо обратный вызов завершения WINHTTP_CALLBACK_STATUS_REQUEST_ERROR , указывающий, что операция выполнена асинхронно, но завершилась сбоем.

Если функция обратного вызова состояния была установлена с winHttpSetStatusCallback, то следующие уведомления, заданные в параметре dwNotificationFlagswinHttpSetStatusCallback , указывают на ход получения ответа:

  • WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
  • WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
  • WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
  • WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE
  • WINHTTP_CALLBACK_STATUS_REDIRECT
Если сервер закрывает подключение, также будут отображаться следующие уведомления при условии, что они были заданы в параметре dwNotificationFlagswinHttpSetStatusCallback:
  • WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION
  • WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED
Примечание Для Windows XP и Windows 2000 см. раздел Требования во время выполнения начальной страницы WinHttp.
 

Примеры

В этом примере показан код, который записывает данные на HTTP-сервер. Имя сервера, указанное в примере , www.wingtiptoys.com, является вымышленным и должно быть заменено именем сервера, для которого у вас есть доступ на запись.

    LPSTR pszData = "WinHttpWriteData Example";
    DWORD dwBytesWritten = 0;
    BOOL  bResults = FALSE;
    HINTERNET hSession = NULL,
              hConnect = NULL,
              hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(  L"A WinHTTP Example Program/1.0", 
                             WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                             WINHTTP_NO_PROXY_NAME, 
                             WINHTTP_NO_PROXY_BYPASS, 0);

    // Specify an HTTP server.
    if (hSession)
        hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",
                                   INTERNET_DEFAULT_HTTP_PORT, 0);

    // Create an HTTP Request handle.
    if (hConnect)
        hRequest = WinHttpOpenRequest( hConnect, L"PUT", 
                                       L"/writetst.txt", 
                                       NULL, WINHTTP_NO_REFERER, 
                                       WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                       0);

    // Send a Request.
    if (hRequest) 
        bResults = WinHttpSendRequest( hRequest, 
                                       WINHTTP_NO_ADDITIONAL_HEADERS,
                                       0, WINHTTP_NO_REQUEST_DATA, 0, 
                                       (DWORD)strlen(pszData), 0);

    // Write data to the server.
    if (bResults)
        bResults = WinHttpWriteData( hRequest, pszData, 
                                     (DWORD)strlen(pszData), 
                                     &dwBytesWritten);

    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse( hRequest, NULL);

    // Report any errors.
    if (!bResults)
        printf("Error %d has occurred.\n",GetLastError());


    // Close any open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);

Требования

Требование Значение
Минимальная версия клиента Windows XP, Windows 2000 Профессиональная с пакетом обновления 3 (SP3) [только классические приложения]
Минимальная версия сервера Windows Server 2003, Windows 2000 Server с пакетом обновления 3 (SP3) [только классические приложения]
Целевая платформа Windows
Header winhttp.h
Библиотека Winhttp.lib
DLL Winhttp.dll
Распространяемые компоненты WinHTTP 5.0 и Internet Обозреватель 5.01 или более поздней версии в Windows XP и Windows 2000.

См. также раздел

Сведения о службах MICROSOFT Windows HTTP (WinHTTP)

Версии WinHTTP

WinHttpCloseHandle

WinHttpOpen

WinHttpOpenRequest

WinHttpSendRequest