赞
踩
要对XHR、Ajax,fetch有个深刻的掌握,让我们先来了解一下xhr、ajax、fetch 这三者都是个啥?以及他们的区别和联系。
// 1.创建XMLHttpReqest对象 const xhr = new XMLHttpRequest() // 2.监听对象状态的改变(宏任务) // 监听四种状态 // xhr.onreadystatechange = function() { // // 1.如果状态不是DONE状态,直接返回 // if(xhr.readystate !== XMLHttpRequest.DONE) return // // 2.确定拿到了数据 // console.log(xhr.response) // } // 监听onload事件,是可以确定拿到了数据的 xhr.onload = function() { console.log(xhr.response) } // 3.配置请求的方式/URL等 xhr.responseType = "json" xhr.timeout = 3000 xhr.open("get", "http://xxx.xx.xx", true) // 4.发送请求 xhr.send() // 5.获取数据 console.log(xhr.response)
现在我们知道了一次完整的ajax的请求过程是什么样子,但是我们对于客户端发送请求传递的参数方式还不甚了解,接下来就一起来看一下吧
在开发中,我们使用最多的是get和post请求,在发送请求的过程中,我们也可以传递给服务器数据
常见的传递给服务器数据的有以下几种:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>客户端传递参数的四种方式</title> </head> <body> <form class="info"> <input type="text" name="username"> <input type="password" name="password"> </form> <button class="send">发送请求</button> <script> const formEl = document.querySelector(".info") const sendBtn = document.querySelector(".send") sendBtn.onclick = function() { // 创建xhr对象 const xhr = new XMLHttpRequest() // 监听数据响应 xhr.onload = function() { console.log(xhr.response) } // 配置请求 xhr.responseType = "json" // 1.方式1:get请求传递参数 xhr.open('get', 'http://xxx.xx.xx/getData?page=1&pageSize=30') xhr.send() // 2.方式2:post请求(urlencoded) xhr.open('post', url) const urlParams = "page=1&pageSize=30" xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded') xhr.send(urlParams) // 3.方式3:post请求传递参数(FormData) // 说明:因为post请求的默认content-type就是formdata格式,所以就不用再设置了 xhr.open('post', url) // 将formElement对象转成FormData对象 const formData = new FormData(formEl) formData.append("admin", 123456) xhr.send(formData) // 4.方式4:post => JSON xhr.open('post', url) const jsonParams = JSON.stringify({page: 1, pageSize: 30}) xhr.setRequestHeader('Content-type', 'application/json, charset=utf-8') xhr.send(jsonParams) } </script> </body> </html>
function myAjax({ url, method = "get", data = {}, timeout = 5000, headers = {}, success, failure } = {}) { // 1.创建xhr对象 const xhr = new XMLHttpRequest() // 2.监听XHR对象状态的变化 xhr.onreadystatechange = function() { if (xhr.readyState !== XMLHttpRequest.DONE) return // 对网络请求返回的状态码进行处理 if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { success && success(xhr.response) } else { failure && failure(xhr.response) } } // 3.设置响应的类型 xhr.responseType = "json" xhr.timeout = timeout // 4.1 设置请求参数 const params = Object.keys(data) .map(key => `${key}=${encodeURIComponent(data[key])}`) const paramsString = params.join("&") // 4.2 设置header,发送网络请求 if (method.toLowerCase() === "get") { xhr.open(method, url + "?" + paramsString) Object.keys(headers).forEach(headerKey => { return xhr.setRequestHeader(headerKey, headers[headerKey]) }) xhr.send() } else { xhr.open(method, url) xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded') Object.keys(headers).forEach(headerKey => { return xhr.setRequestHeader(headerKey, headers[headerKey]) }) xhr.send(paramsString) } return xhr }
function myAjax({ url, method = "get", data = {}, timeout = 5000, headers = {}, success, failure } = {}) { const promise = new Promise((resolve, reject) => { // 1.创建xhr对象 const xhr = new XMLHttpRequest() // 2.监听XHR对象状态的变化 xhr.onreadystatechange = function() { if (xhr.readyState !== XMLHttpRequest.DONE) return // 对网络请求返回的状态码进行处理 if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { resolve(xhr.response) } else { reject({ status: xhr.status, message: xhr.statusText }) } } // 3.设置响应的类型 xhr.responseType = "json" xhr.timeout = timeout // 4.1 设置请求参数 const params = Object.keys(data) .map(key => `${key}=${encodeURIComponent(data[key])}`) const paramsString = params.join("&") // 4.2 设置header,发送网络请求 if (method.toLowerCase() === "get") { xhr.open(method, url + "?" + paramsString) Object.keys(headers).forEach(headerKey => { return xhr.setRequestHeader(headerKey, headers[headerKey]) }) xhr.send() } else { xhr.open(method, url) xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded') Object.keys(headers).forEach(headerKey => { return xhr.setRequestHeader(headerKey, headers[headerKey]) }) xhr.send(paramsString) } }) promise.xhr = xhr return promise }
fetch可以看做是早期的XHR替代方案,它提供了一种更加现代化的处理方案:
比如:
fetch的数据响应主要分为两个阶段:
阶段一:当服务器返回了响应(response)
可以在response的属性中看到HTTP状态:
阶段二:为了获取response body,我们需要使用一个其他的方法调用
fetch(url).then(res => {
console.log(res)
})
async function getData() {
const res = await fetch(url)
const data = res.json()
console.log(data)
}
最后,我们来说一下基于XHR和fetch如何进行文件上传,看代码吧
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>基于XHR进行文件上传</title> </head> <body> <input class="file" type="file"> <button class="upload">上传文件</button> <script> const uploadBtn = document.querySelector(".upload") uploadBtn.onclick = function() { // 1.创建对象 const xhr = new XMLHttpRequest() // 2.监听结果 xhr.onload = function() { console.log(xhr.response) } xhr.onprogress = function(event) { console.log(event) } xhr.responseType = "json" xhr.open("post", url) // 表单 const fileEl = document.querySelector(".file") const file = fileEl.files[0] const formData = new FormData() formData.append("avatar", file) xhr.send(formData) } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>基于fetch进行文件上传</title> </head> <body> <input class="file" type="file"> <button class="upload">上传文件</button> <script> const uploadBtn = document.querySelector(".upload") uploadBtn.onclick = async function() { // 表单 const fileEl = document.querySelector(".file") const file = fileEl.files[0] const formData = new FormData() formData.append("avatar", file) // 发送fetch请求 const response = await fetch(url, { method: "post", body: formData }) const res = await response.json() console.log("res:", res) } </script> </body> </html>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。