【问题标题】:HttpOpenRequest and Accept headerHttpOpenRequest 和 Accept 标头
【发布时间】:2016-01-31 17:41:50
【问题描述】:

HttpOpenRequest 采用一种非常奇怪的格式接受 http 标头。是否可以忽略该参数并稍后添加带有HttpAddRequestHeaders 的正常接受标头?

  hfile = HttpOpenRequest(hLastConnection, 'GET', '/path',  NULL, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_KEEP_CONNECTION, 0);
  HttpAddRequestHeaders(hfile,'Accept: foobar', 14, HTTP_ADDREQ_FLAG_REPLACE or HTTP_ADDREQ_FLAG_ADD);

它确实有效(在 WINE 中),但似乎没有记录。

同样,content-type 和 referer 的情况如何?

【问题讨论】:

    标签: windows http winapi wininet


    【解决方案1】:

    HttpOpenRequest() 如何接受Accept 值并没有奇怪。它只是一个以 null 结尾的字符串数组。 Accept 标头允许多种类型。 HttpOpenRequest() 将连接这些值并为您格式化 Accept 标头。使用HttpAddRequestHeaders(),您必须手动执行此操作。但是无论您使用HttpOpenRequest() 还是HttpAddRequestHeaders() 都没有区别,因为Accept 标头根本不会影响客户端,因此无论您如何将其放入请求中都没有关系。它只在准备响应时影响服务器。

    Referer 相同,它不会影响客户端,只会影响服务器,因此可以根据需要将其添加到请求中。虽然HttpOpenRequest() 有一个很好的简单参数,用于Referer 值所以你应该使用它。

    另一方面,Content-Type 只能用HttpAddRequestHeaders() 设置。但是为GET 请求指定Content-Type 是没有意义的,因为请求中没有有效负载。 Content-Type 仅适用于带有负载的请求,例如 POSTPUT

    【讨论】:

    • 好吧,我已经有了所有格式化标题的列表。在该列表中搜索 accept 并取消拆分它会很奇怪,只是让 HttpOpenRequest 再次加入它。我开始的示例代码 sn -p 使用了 HttpSendRequest 的 header 参数来设置 Content-Type。所以这也和HttpAddRequestHeaders 一样吗?顺便说一句,如果只使用HttpAddRequestHeaders 设置一个标题,则没有理由以 CRLF 结束字符串,是吗?
    • 您可以根据需要使用HttpAddRequestHeaders()HttpSendRequest() 指定额外的标头,但在这两种情况下,每个单独的标头都需要在其末尾添加一个CRLF。
    • 但不是在最后一个标题上,或者?因为我从来没有在上面放过 CRLF 并且它起作用了。 (考虑将其更改为具有 CRLF “但从不更改正在运行的系统”)
    • HttpAddRequestHeaders() 中的所有标题都需要有 CRLF。至于HttpSendRequest(),我不确定它期望的格式,它没有记录。我建议坚持使用HttpAddRequestHeaders(),并在HttpSendRequest() 中保留lpszHeaders NULL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多