在现代Web开发中,与服务器进行数据交互是至关重要的一环。而在早期的Web开发中,原生Ajax(Asynchronous JavaScript and XML)技末正是首要选择之一。通过Ajax,我们可以在不刷新整个页面的情况下向服务器发送请求,并根据响应更新页面的部分内容,实现更加流畅的用户体验。本文将探讨原生Ajax请求的基本流程以及如何将其封装成函数,以便在项目中能更方便的发送请求。
1.请求的基本流程
1.创建 XMLHttpRequest 对象 xhr。
2.通过 xhr 对象里的 open() 方法和服务器建立连接。
3.构建请求所需的数据,并通过 xhr 对象的 send() 方法发送给服务器。
4.通过 xhr 对象的 onreadystatechansge 事件监听服务器的通信状态。
5.通过 xhr 对象 readyState 和 status 属性判断请求状态。
6.接收并处理服务器响应的数据结果。
2.示例代码
const xhr = new XMLHttpRequest() // 第一步 xhr.open('GET', 'url', true) // 第二步 xhr.send() // 第三步 xhr.onreadystatechange=()=>{ // 第四步 // console.log(xhr.readyState,xhr.status); if(xhr.readyState===4 && xhr.status===200){ // 第五步 console.log(xhr.responseText); // 第六步 } }
其中 send 方法接收三个参数分别为:请求方式, 请求地址, 是否异步(默认为异步true)。
readyState 属性用来表示一个 Ajax 请求的全部过程中的某一个状态。
readyState === 0 : 表示未初始化完成,也就是 open 方法还没有执行。
readyState === 1 : 表示配置信息已经完成,也就是执行完 open 之后。
readyState === 2 : 表示 send 方法已经执行完成。
readyState === 3 : 表示正在解析响应内容。
readyState === 4 : 表示响应内容已经解析完毕,可以在客户端使用了。
status 属性记录本次请求的 http 状态码。
readyStateChange 事件用来监听 Ajax 对象的 readyState 值改变。
responseText 用来记录服务端的响应体内容。
3.携带参数的请求
改变 open 方法的第一个参数可以更换请求方式。send 方法可以传入请求的参数。配合setRequestHeader 方法设置请求头来实现复杂类型的请求。
xhr.open("POST", 'url') // 表单格式 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded") xhr.send(`name=luaox&age=23`) // 或 json 格式 xhr.setRequestHeader("Content-Type","application/json") xhr.send(JSON.stringify({name:"luaox",age:23}))
4.使用Promise简单封装Ajax
// get请求 const ajaxGet = (url) => { const promise = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open('GET', url, true) xhr.send() xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText) } else { reject(new Error('请求错误')) } } } }) return promise } // post请求 const ajaxPost = (url, params) => { const promise = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open('GET', url, true) xhr.setRequestHeader("Content-Type","application/json") xhr.send(JSON.stringify(params)) xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText) } else { reject(new Error('请求错误')) } } } }) return promise }