XMLHttpRequest

setRequestHeader 必须在 open() 方法之后,send() 方法之前调用,否则会抛错;
  • setRequestHeader 可以调用多次,最终的值不会采用覆盖 override 的方式,而是采用追加append 的方式。同一个字段也是追加
  • header 大小写不敏感
  • W3C的 xhr 标准中做了限制,规定客户端无法获取 response 中的 Set-Cookie、Set-Cookie2这2个字段,无论是同域还是跨域请求;
  • W3C 的 cors 标准对于跨域请求也做了限制,规定对于跨域请求,客户端允许获取的response header 字段只限于 "simple response header" 和 "Access-Control-Expose-Headers" (两个名词的解释见下方)。
  • "simple response header" 包括的 header 字段有:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma;
    "Access-Control-Expose-Headers":首先得注意是 "Access-Control-Expose-Headers" 进行跨域请求时响应头部中的一个字段,对于同域请求,响应头部是没有这个字段的。这个字段中列举的 header 字段就是服务器允许暴露给客户端访问的字段。
    当xhr为同步请求时,有如下限制:
    • xhr.timeout必须为0
    • xhr.withCredentials必须为 false
    • xhr.responseType必须为""(注意置为"text"也不允许)
    上传过程和下载过程触发的是不同对象的onprogress事件:
    • 上传触发的是 xhr.upload 对象的 onprogress 事件
    • 下载触发的是 xhr 对象的 onprogress 事件
    • 上传载完成触发 xhr.upload 的 onloadend 事件
    • 不管是上传还是下载请求的状态应该在xhr对象的onerror和onload事件中判断

    若在断网状态下调用 xhr.send(data) 方法,则会抛错:Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest'。一旦程序抛出错误,如果不 catch 就无法继续执行后面的代码,所以调用 xhr.send(data) 方法时,应该用 try-catch捕捉错误。

    cookies 也是一种认证信息,在跨域请求中,client 端必须手动设置 xhr.withCredentials=true,且 server 端也必须允许 request 能携带认证信息(即response header中包含 Access-Control-Allow-Credentials:true ),这样浏览器才会自动将cookie 加在 request header中。

    xhr 一共有8个相关事件:7 个 XMLHttpRequestEventTarget 事件+1个独有的 onreadystatechange 事件;而 xhr.upload 只有7个 XMLHttpRequestEventTarget 事件。
    xhrRequest.readyState == 3 && xhrRequest.status == 200 表示请求正确返回,这时还没有onload
    当服务端响应的内容不是指定的responseType时,xhr.response === null;