同步请求的特点:
同步发起方式
发起方式:
发起异步请求的工具:
异步请求的特点:
异步请求,局部刷新,适用单页富应用场景
发起异步请求,接收响应
第一步: 创建对象
第二步:初始化该对象:设置监听
设置获取成功响应的回调函数
设置失败响应的回调函数
代码实现
xhr.onreadystatechange = function (){
if(xhr.readyState==4&&xhr.status==200)
{
// 调用成功后的回调函数
document.getElementById("shwRslt").innerText = xhr.responseText;
}
else if(xhr.readyState==4&&xhr.status !==200)
{
// 调用失败响应回调函数
}
}
第三步:
代码实现:
xhr.open(method, url, async)
说明:
第四步:(依据请求方式可选)设置请求头
代码实现:
xhr.setRequestHeader(“Content-Type”, value);
选择依据:
第五步:发起请求
(function()
{
var MyAjax=function (){};
MyAjax.prototype={
myMtdRqst:function (mth,url,paramer,masync,disposeRslt)
{
const xhr = newXMLHttpRequest();
xhr.onreadystatechange=function ()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
disposeRslt(xhr.responseText);
}
}
}
if(mth=="GET")
{
url= `${url}?name=${paramer}`;
paramer=null;
}
xhr.open(mth,url,masync);
if(mth=="POST")
{
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
paramer=`name=${paramer}`;
}
xhr.send(paramer);
}
}
window.myajax=new MyAjax();
})();
Ajax是对原生XHR的封装,为了达到我们跨越的目的,增添了对JsonP的支持。
异步的javascript和xml,ajax不是一门新技术,而是多种技术的组合,用于快速的创建动态页面,能够实现无刷新更新数据从而提高用户体验。
属性:url、method、dataType、beforeSend、success、error…
由客户端请求ajax引擎,再由ajax引擎请求服务器,服务器作出一系列响应之后返回给ajax引擎,由ajax引擎决定将这个结果写入到客户端的什么位置。实现页面无刷新更新数据。
XMLHttpRequest
axios({
//指定的请求方式
method: 'get',
//指定服务器处理请求的URL
url: '',
//指定客户端向服务器发送数据的格式: application/json
headers: {contentType: ""},
//用于指定get|delect请求携带的参数
params: {},
//指定post|put请求携带的参数
data: {},
}).then(res=>{})//成功后的回调函数
.catch(res=>{})//失败后的回调函数
// 第一种方式 将参数直接写在url中
axios.get('/getMainInfo?id=123')
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
// 第二种方式 将参数直接写在params中
axios.get('/getMainInfo', {
params: {
id: 123
}
})
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
[email protected]
4.4.2.1 默认情况下请求配置
4.4.1.2
4.4.3.1 实现要点:
当修改Content-Type为application/x-www-form-urlencoded时:
如下所示:
{
"name":"启用","type":"1","alias":"enable","roleId":"1","features":"依据权限启用指定的被禁用的菜单","path":"","componentName":"",
"componentAlias":"菜单管理","iconClass":"fas fa-redo-alt","parentId":"3",
"routerParentId":"1","createdDate":null,"createdUser":"admin","modifiedDate":null,"modifiedUser":"","enabled":true,"permission":"sys:menu:enable"
}
此时后端将无法正确获取数据。
HttpMediaTypeNotSupportedException
,具体信息为:
思路:需要对Axios自动换成的Json进行还原成URL编码格式。
方式一:配置POST|PUT请求,自定义转换方法。根据官网介绍,可以通过如下配置:
// `transformRequest` 允许在向服务器发送前,修改请求数据
// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
transformRequest: [function (data, headers) {
// 对 data 进行任意转换处理
return data;
}],
方式二:通过 qs
第三方模块,完成配置。具体实现步骤:
第一步:引用qs。axios模块默认整合了qs模块,仅需通过import导入即可。
import Qs from "qs";
第二步:调用Qs.Stringify()方法,实参为待转换的数据对象。
const {data} = await that.$http.post("/menu", Qs.stringify(that.menuData), {headers: {"Content-Type" : "application/x-www-form-urlencoded"}});
转换后结果为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-na0aEA39-1653130782778)(Ajax%E4%B8%8EAxios%206c512/Untitled.png)]
4.5.1.1 作用
then
或 catch
处理前拦截,提前做出必要的处理。4.5.1.2 分类
axios.interceptors.request.use()
axios.interceptors.response.use()
4.5.1.3 注意事项
4.5.2.1 拦截器原型
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
4.5.2.2 具体适用场景示例
axios.interceptors.request.use(config => {
if(sessionStorage.getItem("tokenContent"))
{
let tokenContent = JSON.parse(sessionStorage.getItem("tokenContent"));
if(tokenContent.tokeHead && tokenContent.tokenBody) {
if (tokenContent.tokenHeader)
config.headers[tokenContent.tokenHeader] = tokenContent.tokenHead + tokenContent.tokenBody;
else
config.headers.Authorization = tokenContent.tokenHead + tokenContent.tokenBody;
}
}
return config;
})
4.5.3.1 拦截器原型
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
4.5.3.2 适用场景
axios.interceptors.response.use(response => {
let code = [2000, 5001, 5002, 5003];
if(!code.includes(response.data.operateStatusCode))
{
Notification.error(response.data.operateMessage);
}
return response;
})
Ajax:未对返回结果进行封装:结果保存在成功|失败的回调的形参中。
Axios:结果进行了封装:promise对象
axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样。
简单来说就是ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,axios有的ajax都有,ajax有的axios不一定有。