【问题标题】:When to use setRequestHeader for Ajax and XMLHttpRequest何时将 setRequestHeader 用于 Ajax 和 XMLHttpRequest
【发布时间】:2015-09-19 19:16:00
【问题描述】:
  1. 我是否应该手动将 setRequestHeader 设置为 'application/x-www-form-urlencoded' 用于 ajax POST?
  2. 我是否应该手动将 setRequestHeader 设置为“multipart/form-data”来上传 ajax 文件?
  3. 对于setRequestHeader,XMLHttpRequest 和 XMLHttpRequest2 有不同的要求吗?

编程常识告诉我,浏览器可以根据 .open() 和 .send() 方法的值轻松决定应该发送哪些标头。只有当我有一些自定义标题要发送时,才应该使用setRequestHeader。但这里真的是这样吗?

我正在寻找“引擎盖下到底发生了什么”类型的答案!

.

xhttp.setRequestHeader('Content-type', 'multipart/form-data');  // for files

xhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded'); // for POST escaped 'form' data

编辑:

我可以类似地要求 Connection 或 Content-length 标头。许多教程建议发送这些标头。但在实践中这是错误的。浏览器将这些标头视为unsafe 并发送内部计算的值。

http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

编辑2:

就像在 this SO question 中一样,当我删除 content-type 和其他无意义的标头时,一切都开始工作了。
现在我真的很想知道setRequestHeader 的底层是什么,我应该什么时候真正使用它!

【问题讨论】:

    标签: javascript ajax http-headers


    【解决方案1】:

    对于 ajax POST,我是否应该手动将 setRequestHeader 设置为 'application/x-www-form-urlencoded'?

    是的。如果您传递 send() 一个字符串(您将用于 application/x-www-form-urlencoded),则默认内容类型为 text/plain。

    我是否应该手动将 setRequestHeader 设置为 'multipart/form-data' 以进行 ajax 文件上传?

    没有。如果您使用 multipart/form-data 进行文件上传,那么您将使用 FormData 对象,XHR 将为您设置它。

    如果您将其设置为仅multipart/form-data,那么您将省略边界信息并且它将不起作用。

    XMLHttpRequest 和 XMLHttpRequest2 有不同的要求吗

    XHR 2 的工作已停止。

    【讨论】:

    • 出乎意料的好答案 :) 你能详细解释一下Work on XHR 2 has been discontinued
    • w3.org/TR/XMLHttpRequest2 表示“此文档的工作已停止,不应引用或用作实施的基础。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2018-06-19
    • 2013-10-13
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多