何时对Ajax和XMLHttpRequest使用setRequestHeader

When to use setRequestHeader for Ajax and XMLHttpRequest

本文关键字:使用 setRequestHeader XMLHttpRequest Ajax 何时      更新时间:2023-09-26
  1. 对于ajax POST,我是否应该手动将setRequestHeader设置为"application/x-www-form-urlencoded">
  2. 我是否应该手动将setRequestHeader设置为"多部分/表单数据"以上传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

编辑:

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

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

第2版:

就像在这个SO问题中,当我删除内容类型和其他无意义的标题时,一切都开始工作了
现在我真的很想知道setRequestHeader的背后是什么,什么时候才能真正使用它!

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

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

对于ajax文件上传,我是否应该手动将setRequestHeader设置为"multipart/form-data"?

没有。如果您使用多部分/表单数据上传文件,那么您将使用FormData对象,XHR将为您设置它。

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

XMLHttpRequest和XMLHttpRequest2 是否有不同的要求

XHR 2的工作已经停止。