WinHttpReceiveResponse 函式 (winHTTP.h)

WinHttpReceiveResponse 函式會等候接收 WinHttpSendRequest 所起始 HTTP 要求的回應。 當 WinHttpReceiveResponse 成功完成時,狀態代碼和響應標頭已收到,且可供應用程式使用 WinHttpQueryHeaders 進行檢查。 應用程式必須先呼叫 WinHttpReceiveResponse ,才能使用 WinHttpQueryDataAvailableWinHttpReadData 來存取回應實體主體 (如果有任何) 。

語法

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

參數

[in] hRequest

WinHttpOpenRequestWinHttpSendRequest 所傳回的 HINTERNET 句柄。 等待 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 通訊協定。 例如,除非客戶端特別啟用 SSL2,否則 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 用於異步模式 (亦即,在 WinHttpOpen) 中設定WINHTTP_FLAG_ASYNC時,此函式可以同步或異步操作。 如果此函式傳回 FALSE,此函式會失敗,而且您可以呼叫 GetLastError 以取得擴充的錯誤資訊。 如果此函式傳回 TRUE,應用程式應該預期 WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE 完成回呼,表示成功,或 WINHTTP_CALLBACK_STATUS_REQUEST_ERROR 完成回呼,表示作業以異步方式完成,但失敗。

如果狀態回呼函式已經與 WinHttpSetStatusCallback 一起安裝,則在 WinHttpSetStatusCallbackdwNotificationFlags 參數中設定的下列通知會指出接收回應的進度:

  • WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
  • WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
  • WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
  • WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE
  • WINHTTP_CALLBACK_STATUS_REDIRECT
如果伺服器關閉連線,則也會回報下列通知,前提是這些通知已在 WinHttpSetStatusCallbackdwNotificationFlags 參數中設定:
  • 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 Professional 與 SP3 [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003、Windows 2000 Server 與 SP3 [僅限桌面應用程式]
目標平台 Windows
標頭 winhttp.h
程式庫 Winhttp.lib
Dll Winhttp.dll
可轉散發套件 Windows XP 和 Windows 2000 上的 WinHTTP 5.0 和 Internet Explorer 5.01 或更新版本。

另請參閱

關於 Microsoft Windows HTTP Services (WinHTTP)

WinHTTP 版本

WinHttpCloseHandle

WinHttpOpen

WinHttpOpenRequest

WinHttpSendRequest