何时为 Ajax 和 XMLHttpRequest 使用 setRequestHeader

When to use setRequestHeader for Ajax and XMLHttpRequest

  1. 我是否应该为 ajax POST 手动将 setRequestHeader 设置为 'application/x-www-form-urlencoded'?
  2. 我是否应该为 ajax 文件上传手动将 setRequestHeader 设置为 'multipart/form-data'?
  3. 关于 setRequestHeader,XMLHttpRequest 和 XMLHttpRequest2 是否有不同的要求?

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

我正在寻找 "what's really going on under the hood" 类型的答案!

.

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 headers。许多教程建议发送那些 headers。但实际上这是错误的。浏览器将那些 headers 视为 unsafe 并发送内部计算的值。

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

编辑2:

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

Should I ever manually set setRequestHeader to 'application/x-www-form-urlencoded' for ajax POST?

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

Should I ever manually set setRequestHeader to 'multipart/form-data' for ajax file upload?

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

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

Are there different requirements for XMLHttpRequest and XMLHttpRequest2

XHR 2 的工作已经停止。