WinHttpAddRequestHeaders 函数 (winhttp.h)

WinHttpAddRequestHeaders 函数将一个或多个 HTTP 请求标头添加到 HTTP 请求句柄。

Syntax

WINHTTPAPI BOOL WinHttpAddRequestHeaders(
  [in] HINTERNET hRequest,
  [in] LPCWSTR   lpszHeaders,
  [in] DWORD     dwHeadersLength,
  [in] DWORD     dwModifiers
);

Parameters

[in] hRequest

由对 WinHttpOpenRequest 函数的调用返回的 HINTERNET 句柄。

[in] lpszHeaders

指向包含要追加到请求的标头的字符串变量的指针。 除最后一个标头外,每个标头都必须由回车符/换行符(CR/LF)终止。

[in] dwHeadersLength

一个无符号长整数值,该值包含 lpszHeaders 的长度(以字符为单位)。 如果 dwHeadersLength 为 -1L,则函数假定 lpszHeaders 为零终止 (ASCIIZ),并且计算长度。

如果 dwHeadersLength 不是 -1L,则该函数将准确复制 dwHeadersLength 字符。 WinHTTP 不会检查 lpszHeaders 是否包含零终止字符串。

[in] dwModifiers

一个无符号长整数值,该值包含用于修改此函数语义的标志。 可以是以下一个或多个标志。

价值 含义
WINHTTP_ADDREQ_FLAG_ADD
如果标头不存在,则添加该标头。 与 WINHTTP_ADDREQ_FLAG_REPLACE一起使用。
WINHTTP_ADDREQ_FLAG_ADD_IF_NEW
仅当标头尚不存在时才添加标头;否则,将返回错误。
WINHTTP_ADDREQ_FLAG_COALESCE
合并同名的标头。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
使用逗号合并同名的标头。 例如,添加“Accept: text/*”后跟“Accept: audio/*”,此标志会导致单个标头“Accept: text/*, audio/*”。 这会导致找到的第一个标头合并。 调用应用程序必须确保合并标头和单独的标头具有凝聚力的方案。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON
使用分号合并同名的标头。
WINHTTP_ADDREQ_FLAG_REPLACE
替换或删除标头。 如果标头值为空且找到标头,则会将其删除。 如果值不为空,则替换该值。

返回值

如果成功,则返回 TRUE ;否则返回 FALSE 。 有关扩展错误信息,请调用 GetLastError。 返回的错误代码如下。

错误代码 说明
ERROR_WINHTTP_INCORRECT_HANDLE_STATE
无法执行请求的操作,因为提供的句柄未处于正确状态。
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
为此作提供的句柄类型不正确。
ERROR_WINHTTP_INTERNAL_ERROR
发生了内部错误。
ERROR_NOT_ENOUGH_MEMORY
没有足够的内存可用于完成请求的作。

Remarks

标头跨重定向传输。 这可以是安全问题。 为了避免在重定向发生时传输标头,请使用 WINHTTP_STATUS_CALLBACK 回调更正重定向时的特定标头。

即使 WinHTTP 在异步模式下使用(即在 WinHttpOpen中设置 WINHTTP_FLAG_ASYNC),此函数也会同步运行。 返回值指示成功或失败。 若要获取扩展的错误信息,请调用 GetLastError

WinHttpAddRequestHeaders 函数将额外的自由格式标头追加到 HTTP 请求句柄,旨在供需要详细控制发送到 HTTP 服务器的确切请求的复杂客户端使用。

验证随此函数添加的请求标头的名称和值。 标头的格式必须良好。 有关有效的 HTTP 标头的详细信息,请参阅 RFC 2616。 如果使用无效标头,此函数将失败, GetLastError 返回 ERROR_INVALID_PARAMETER。 未添加无效标头。

如果要发送 Date:请求标头,则可以使用 WinHttpTimeFromSystemTime 函数为标头创建结构。

对于基本的 WinHttpAddRequestHeaders,应用程序可以在单个缓冲区中传入多个标头。

应用程序还可以使用 WinHttpSendRequest 将其他标头添加到 HTTP 请求句柄,然后再发送请求。

注意 有关详细信息,请参阅 Run-Time 要求
 

示例

下面的代码示例在请求中包含 If-Modified-Since 标头。 将解释响应标头,以确定目标文档是否已更新。


  DWORD dwSize = sizeof(DWORD);
  DWORD dwStatusCode = 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.microsoft.com",
                               INTERNET_DEFAULT_HTTP_PORT,
                               0 );

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

  // Add a request header.
  if( hRequest )
    bResults = WinHttpAddRequestHeaders( hRequest, 
                 L"If-Modified-Since: Mon, 20 Nov 2000 20:00:00 GMT",
                                         (ULONG)-1L,
                                         WINHTTP_ADDREQ_FLAG_ADD );

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

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

  // Use WinHttpQueryHeaders to obtain the header buffer.
  if( bResults )
    bResults = WinHttpQueryHeaders( hRequest, 
                WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
                                    NULL, 
                                    &dwStatusCode,
                                    &dwSize,
                                    WINHTTP_NO_HEADER_INDEX );

  // Based on the status code, determine whether 
  // the document was recently updated.
  if( bResults )
  {
    if( dwStatusCode == 304 ) 
      printf( "Document has not been updated.\n" );
    else if( dwStatusCode == 200 ) 
      printf( "Document has been updated.\n" );
    else 
      printf( "Status code = %u.\n",dwStatusCode );
  }

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

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

Requirements

要求 价值
最低支持的客户端 具有 SP3 的 Windows XP、Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows Server 2003、带 SP3 的 Windows 2000 Server [仅限桌面应用]
目标平台 Windows操作系统
Header winhttp.h
Library Winhttp.lib
DLL Winhttp.dll
可再分发 Windows XP 和 Windows 2000 上的 WinHTTP 5.0 和 Internet Explorer 5.01 或更高版本。

另见

关于 Microsoft Windows HTTP 服务 (WinHTTP)

WinHTTP 版本

WinHttpOpenRequest

WinHttpSendRequest