JS原生请求有哪些?有什么区别?

92 阅读1分钟
  1. 原生请求有哪些?有什么区别?
  • 主要指浏览器提供的两种原生 API:XMLHttpRequest、fetch
  • XMLHttpRequest (XHR):
    • 历史:  较老的 API,最早由 IE 引入,后被标准化。
    • 特点:
      • 基于事件和回调函数 (onreadystatechangeonloadonerror 等)。
      • 功能强大且灵活,支持同步(不推荐)和异步请求。
      • 可以获取请求进度 (onprogress)。
      • 兼容性极好(几乎所有浏览器)。
    • 缺点:  回调地狱(Callback Hell),语法相对繁琐。
  • fetch API:
    • 历史:  现代浏览器引入的新 API,基于 Promise。
    • 特点:
      • 基于 Promise,链式调用 (then/catch/finally),代码更简洁易读,避免回调地狱。
      • 设计更现代化,与 Service Workers 等新特性集成更好。
      • 默认不携带 Cookie(需设置 credentials: 'include')。
      • 对错误处理有差异:只有网络故障(如无法连接)才会导致 Promise 被 reject,HTTP 错误状态码(如 404, 500)不会导致 reject,需要在 then 里检查 response.ok 或 response.status
      • 提供更强大的功能选项(如 RequestResponseHeaders 对象)。
    • 缺点:  不支持超时设置(需结合 AbortController),不支持请求进度监控(需结合 ReadableStream),兼容性稍逊于 XHR(旧浏览器如 IE 完全不支持)。 主要区别总结:
特性XMLHttpRequest (XHR)fetch API
基础事件/回调Promise
语法相对繁琐更简洁、现代
错误处理状态码非 2xx 会触发 onerrorHTTP 错误不 reject Promise
Cookie默认发送默认不发送 (credentials)
超时原生支持 (timeout)需结合 AbortController
进度原生支持 (onprogress)需结合 ReadableStream
兼容性非常好现代浏览器良好 (IE 不支持)
现代化较旧新标准,功能更强大