掌握 XMLHttpRequest ,了解请求库的实现机制

本文详细介绍了如何使用 XMLHttpRequest 发起 GET 请求,包括设置请求参数、处理请求状态改变、超时处理及请求头设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先做个尝试

为了确保没有跨域的错误,使用浏览器打开百度首页,然后打开控制台,将如下代码输入控制台并执行

var type = "GET" 
var isAsync = true 
var url = "https://www.baidu.com/" 

var xhr = new XMLHttpRequest()
xhr.onreadystatechange = stateChange 
xhr.open(type, url, isAsync)  
xhr.send()  

function stateChange() {
  // 如果你想打个断点了解的更清楚一点,解开下一行的注释
  // debugger
  var state = xhr.readyState
  if(state === 1) {  
    xhr.setRequestHeader("myProperty", "How XMLHttpRequest works?")
  } else if (state == 4) {  
    var status = xhr.status
    if (status == 200){
      var response = xhr.response
      console.log(response)
    }
  }
}

这样就使用 XMLHttpRequest 实现了一个简单的GET请求

参数、方法与状态码说明

var type = "GET"  // 请求方式
var isAsync = true  // 是否为异步,不传参时默认异步
var url = "https://www.baidu.com/"  // 请求路径

var xhr = new XMLHttpRequest()  // 新建请求实例
xhr.onreadystatechange = stateChange  // 请求过程中的状态改变回调
xhr.open(type, url, isAsync)  // 初始化请求参数
xhr.send()  // 发送请求,如果是 POST、PUT 请求需传入请求体

// 状态改变回调与状态码所对应的行为
function stateChange() {
  var state = xhr.readyState

    // 注意:状态码为 0 时,不会触发本回调方法
    // 初始化状态。XMLHttpRequest 对象已创建
    // 或已被 abort() 方法重置。

  if(state === 1) {  
    // open() 方法已调用,但是 send() 方法未调用。
    // 请求还没有被发送。

  } else if(state === 2) {  
    // Send() 方法已调用,HTTP 请求已发送到 Web 服务器。
    // 未接收到响应。

  } else if(state === 3) {  
    // 所有响应头部都已经接收到。
    // 响应体开始接收但未完成。

  } else if (state==4) {  
    // HTTP 响应已经完全接收。
  }
}

超时处理(取消请求同理)

var timeout = 20 * 1000  // 20秒后超时
var isTimeout = false

var timeoutHandler = setTimeout(()=> {
  isTimeout = true
  xhr.abort()  
  // 把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,
  // 并且取消所有未决的网络活动。
}, timeout)

function stateChange() {
  var state = xhr.readyState
  if (isTimeout) {  
    // 请求超时
  } else if(state == 4) {
    clearTimeout(timeoutHandler)
  }
}

设置请求头

function stateChange() {
  var state = xhr.readyState
  if(state === 1) {  
    // open() 方法已调用,但是 send() 方法未调用。

    xhr.setRequestHeader("Pragma", "no-cache")
    xhr.setRequestHeader("content-type", "application/json")
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值