Windows 8 覆盖IXMLHTTPRequest2的默认标头
我试图在Windows 8上使用IXMLHTTPRequest2对象发送HTTP请求,我想将传出的Accept编码头自定义为默认值“gzip,deflate”以外的值。当我尝试使用SetRequestHeader方法设置Accept Encoding标头时,方法调用成功,但发送请求时仍然使用默认标头值,而不是我提供的值(通过使用Wireshark捕获HTTP请求进行验证) 示例代码(斜面简化): Wireshark捕获已发出的请求:Windows 8 覆盖IXMLHTTPRequest2的默认标头,windows-8,Windows 8,我试图在Windows 8上使用IXMLHTTPRequest2对象发送HTTP请求,我想将传出的Accept编码头自定义为默认值“gzip,deflate”以外的值。当我尝试使用SetRequestHeader方法设置Accept Encoding标头时,方法调用成功,但发送请求时仍然使用默认标头值,而不是我提供的值(通过使用Wireshark捕获HTTP请求进行验证) 示例代码(斜面简化): Wireshark捕获已发出的请求: GET /users/me/id HTTP/1.1 Accep
GET /users/me/id HTTP/1.1
Accept: */*
Host: 192.168.0.100
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
根据,它只是一个追加操作。您得到了gzip接受编码,因此我认为它按预期工作。但是,我没有看到删除默认标题的方法 似乎可以将IXMLHTTPRequest2::SetProperty()与XHR_PROP_NO_DEFAULT_头一起使用来抑制默认头
请参阅:似乎
IXMLHTTPRequest2
API显然已损坏,因为它无法删除标头。或者,文档被破坏了,因为它没有提到传递空字符串或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;
标头的值被标记为可选(\uuuuurpc\uuuu in\uopt\u string
)并且可以为空
因此,如果您真的想设置头的值,使用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或空字符串(例如,
header,或者可以删除您自己的标题),则可以完成删除这些标题Accept Language
- 您可以更改,但不能删除某些标题(例如,
header)User-Agent
- 您根本无法更改某些标题(例如,
header)Accept Encoding
IXMLHTTPRequest2
上调用->Send
时,他们会在内部无条件地将Accept Encoding
设置为他们想要使用的任何内容。这意味着您不能添加一些替代编码,如不借助黑客和自定义头
他们应该开始使用libcurl并公开它的API,而不是公开
IXMLHTTPRequest2
可耻的质量。我尝试了这个“句柄->设置属性(XHR\u PROP\u NO\u DEFAULT\u HEADERS,1);”但是它没有从头中删除Accept编码:gzip,deflate。
m_pXHR->SetRequestHeader(L"Accept-Encoding", L"");