0

我正在尝试使用 IXMLHTTPRequest2 对象在 Windows 8 上发送 HTTP 请求,并且我想将传出的 Accept-Encoding 标头自定义为“gzip,deflate”的默认值以外的其他内容。当我尝试使用 SetRequestHeader 方法设置 Accept-Encoding 标头时,方法调用成功,但仍使用默认标头值而不是我提供的值发送请求(通过使用 Wireshark 捕获 HTTP 请求进行验证)。

示例代码(为简化起见):

::CoCreateInstance( CLSID_FreeThreadedXMLHTTP60, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &m_pXHR ));
m_pXHR->Open( "GET", "http://192.168.0.100/test", m_pXHRCallback.Get(), NULL, NULL, NULL,NULL );
m_pXHR->SetRequestHeader( L"Accept-Encoding", L"gzip" );
m_pXHR->Send( NULL, 0 );

Wireshark 捕获发出的请求:

GET /users/me/id HTTP/1.1
Accept: */*
Host: 192.168.0.100
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
4

3 回答 3

1

根据SetRequestHeader 的文档,它只是一个追加操作。你得到了 gzip Accept-Encoding,所以我认为它按预期工作。但是,我看不到删除默认标头的方法。

于 2013-01-11T18:27:52.950 回答
0

您似乎可以将 IXMLHTTPRequest2::SetProperty() 与 XHR_PROP_NO_DEFAULT_HEADERS 一起使用来抑制默认标头。

请参阅:http: //msdn.microsoft.com/en-us/library/windows/desktop/hh831167 (v=vs.85).aspx

于 2013-12-06T09:13:29.830 回答
0

似乎IXMLHTTPRequest2API 显然被破坏了,因为它没有办法删除标头。或者,也许,文档被破坏了,因为它没有提到传递一个空字符串或 NULL 会删除一个标题。

此外,根据IXMLHTTPRequest2::SetRequestHeader声明:

virtual HRESULT STDMETHODCALLTYPE SetRequestHeader(
    /* [ref][string][in] */ __RPC__in_string const WCHAR *pwszHeader,
    /* [unique][string][in] */ __RPC__in_opt_string const WCHAR *pwszValue) = 0;

标头的值被标记为可选 ( __RPC__in_opt_string) 并且可以为 NULL。

所以,如果你真的想设置一个标题的值,唯一正确的方法IXMLHTTPRequest2是这样做:

m_pXHR->SetRequestHeader(L"SomeMyHeader", L"");
m_pXHR->SetRequestHeader(L"SomeMyHeader", L"value");

这样您就可以删除或更改一些默认标题:

m_pXHR->SetRequestHeader(L"Accept-Language", L"");

由于这没有记录在案,因此在某些特定版本的 Windows 上,这可能会或可能不会对您有用。如果您尝试IXMLHTTPRequest2大量使用,您会得出与我相同的结论:这只是废话。例如,这不起作用:

m_pXHR->SetRequestHeader(L"Accept-Encoding", L"");

似乎一些实现的家伙IXMLHTTPRequest2在那里放了很多未记录的逻辑:

  • 如果将某些标头设置为 NULL 或空字符串(例如Accept-Language标头,或者可以删除您自己的标头),则可以完成删除某些标头。
  • 您可以更改,但不能删除某些标题(例如,User-Agent标题)。
  • 您根本无法更改某些标题(例如,Accept-Encoding标题)。

当您调用 -> Sendon 时IXMLHTTPRequest2,它们在内部无条件地设置Accept-Encoding为他们想要使用的任何内容。这意味着如果不求助于 hack 和自定义标头,您就无法添加一些替代编码,例如brotli 。

他们应该开始使用 libcurl 并公开它的 API,而不是暴露IXMLHTTPRequest2可耻的质量。

于 2018-05-14T23:52:43.373 回答