axios是ajax封装的,基于Promise+XMLHttpRequest来进行的封装。
种类
语法
baseURL:基础路径
params:传递的参数
timeout: 超时时间
withCredentials: false 是否允许携带跨域资源凭证
responseType: ‘json’ //返回数据的类型
responseType
表示服务器响应的数据类型,
onUploadProgress: function (progressEvent) {} 监控文件上传进度
onDownloadProgress: function (progressEvent) {} 监控文件下载进度
validateStatus 状态码成功范围
validateStatus: function (status) {//状态码成功范围
return status >= 200 && status < 300; // default
}
get的url全写
axios
.get("http://localhost:8888/api/articleList?date=2021-05-21")
.then((value) => {
console.log(value);
});
get的config分开写
axios
.get("/api/articleList", {
baseURL: "http://localhost:8888",
params: {
date: "2021-05-21",
},
})
.then((response) => {
return response.data;
})
get配置参数
axios
.get("/api/articleList", {
baseURL: "http://localhost:8888",
params: {
date: "2021-05-21",
},
timeout: 1000,
withCredentials: false,
responseType: "json",
validateStatus: function (status) {
return status >= 200 && status < 400;
},
})
.then((response) => {
return response.data;
})
.then((value) => {
console.log(value);
})
.catch((err) => {
console.log(err);
});
get全写
axios({
method: "get",
url: "/api/articleList",
baseURL: "http://localhost:8888",
params: {
date: "2021-05-21",
},
timeout: 1000,
withCredentials: false,
responseType: "json",
validateStatus: function (status) {
return status >= 200 && status < 400;
},
})
.then((response) => {
return response.data;
})
.then((value) => {
console.log(value);
})
.catch((err) => {
console.log(err);
});
method:'get'
默认get,请求方式种类
语法
baseURL:基础路径
timeout: 超时时间
withCredentials: false 是否允许携带跨域资源凭证
responseType: ‘json’ //返回数据的类型
responseType
表示服务器响应的数据类型,
onUploadProgress 监控文件上传进度
onUploadProgress: function (progressEvent) {} 监控文件上传进度
onDownloadProgress 监控文件下载进度
onDownloadProgress: function (progressEvent) {} 监控文件下载进度
validateStatus 校验服务器返回状态码为多少才算请求成功
validateStatus: function (status) {//状态码成功范围
return status >= 200 && status < 300; // default
}
transformRequest 允许在向服务器发送前,修改请求数据
不过,如果担心axios识别不了请求头中请求体数据格式,也可以手动设置
//设置请求头信息
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
post的配置
axios.post("/user/login",{
account:"18310612838",
password:md5("1234567890")//md5方法是一个外部方法,需要引入,用于处理密码的转化。
},{
baseURL:"http://127.0.0.1:9999",
transformRequest:function(data){//参数格式是 urlencoded
//Qs.stringify() 将普通对象---》 urlencoded格式的数据
//console.log(Qs.stringify(data));
return Qs.stringify(data);//决定最终数据的格式//Qs.stringify()方法是外部Qs对象的一个内置方法,需要引入,用于把普通对象转成urlencoded格式的数据。
}
}).then(response=>{
return response.data
}).then(value=>{
console.log(value)
}).catch(err=>{
console.log(err)
})
post全写-axios.post()用axios()方式代替
method:“post”
url:“/user/login”
data:是作为请求主体被发送的数据
axios({
url:"/user/login",
method:"post",
data:{
account:"18310612838",
password:md5("1234567890")//md5方法是一个外部方法,需要引入,用于处理密码的转化。
},
baseURL:"http://127.0.0.1:9999",
transformRequest:function(data){//参数格式是 urlencoded
return Qs.stringify(data);//决定最终数据的格式//Qs.stringify()方法是外部Qs对象的一个内置方法,需要引入,用于把普通对象转成urlencoded格式的数据。
}
}).then(response=>{
return response.data
}).then(value=>{
console.log(value)
}).catch(err=>{
console.log(err)
})
Axios的二次配置 就是 将请求的公共部分提起出来
把多个请求之间公共的部分进行提取,后期在业务中再次发送数据请求,公共部分无需再次编写
原版的
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>Documenttitle>
head>
<body>
<script src="axios.min.js">//这个是引入axios()的,用于发送axaj请求script>
<script src="md5.min.js">//这个是引入md5()方法的,用于加密密码script>
<script src="qs.js">//这个是引入Qs.stringify()方法的,用于把普通对象转成query格式字符串的script>
<script>
axios.get("/api/articleList",{
baseURL:"http://localhost:8888",
params:{
date:"2021-05-21"
},
timeout:1000,
withCredentials: false,
validateStatus: function (status) {
return status >= 200 && status < 400;
}
}).then(response=>{
return response.data;
}).then(value=>{
console.log(value);
}).catch(err=>{
console.log(err);
})
axios.get("/api/swiper",{
baseURL:"http://localhost:8888",
timeout:1000,
withCredentials: false,
validateStatus: function (status) {
return status >= 200 && status < 400;
}
}).then(response=>{
return response.data;
}).then(value=>{
console.log(value);
}).catch(err=>{
console.log(err);
})
axios.post("/user/login",{
account:"18310612838",
password:md5("1234567890")
},{
baseURL:"http://127.0.0.1:9999",
transformRequest:function(data){
return Qs.stringify(data);
}
}).then(response=>{
return response.data
}).then(value=>{
console.log(value)
}).catch(err=>{
console.log(err)
})
script>
body>
html>
处理后的,axios做了公共的处理,在http.js中处理了一个。所以在html里,发起一个axios请求,不用做一些配置。
./http.js
//Axios 二次封装文件
//提取baseURL
axios.defaults.baseURL = "http://localhost:8888";
//注释--》404错误
//axios.defaults.baseURL="http://localhost:8888";
//提出超时时间
axios.defaults.timeout = 1000;
//请求超时错误
//axios.defaults.timeout=1;
//提取 跨域资源凭证
axios.defaults.withCredentials = false;
//提取状态码的范围设置
axios.defaults.validateStatus = function (status) {
return status >= 200 && status < 400;
};
//判断对象是不是纯对象
const isPlainObject = function isPlainObject(obj) {
let proto, Ctor;
if (!obj || Object.prototype.toString.call(obj) !== "[object Object]")
return false;
proto = Object.getPrototypeOf(obj);
if (!proto) return true;
Ctor = proto.hasOwnProperty("constructor") && proto.constructor;
return typeof Ctor === "function" && Ctor === Object;
};
//post类提取 transformRequest
axios.defaults.transformRequest = function (data) {
//纯对象 {}---》urlencoded
if (isPlainObject(data)) {
data = Qs.stringify(data); //是纯对象才会转换
}
return data;
};
// 添加请求拦截器
//客户端----- 统一做某些操作 ----服务器
axios.interceptors.request.use(
function (config) {
// 在发送请求之前做些什么
// 发送请求的时候,一般会在请求头里统一配置 token
// let token=...
// if(token){
// config.headers.authorzation=token
// }
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
}
);
// 添加响应拦截器
//服务器----- 统一做某些操作 ----客户端
axios.interceptors.response.use(
function (response) {
// 对响应数据做点什么
//console.log(response,"111");
return response.data;
},
function (error) {
//错误
//1. 有状态码
// response--->status--->404/500
//2. 没有状态码的错误
// 2.1 请求超时 code: "ECONNABORTED" response: undefined
// 2.2 断网 BOM对象--->navigator对象(浏览器相关信息)navigator.onLine true 有网
let err = "未知错误";
if (error.response) {
//有状态码错误
switch (error.response.status) {
case 404:
err = "找不到页面";
break;
case 500:
err = "服务器错误";
break;
//....
default:
break;
}
} else {
//没有状态码的错误
if (error.code === "ECONNABORTED") {
err = "请求超时";
} else if (!navigator.onLine) {
err = "没有网络";
}
}
// 对响应错误做点什么
return Promise.reject(err);
}
);
index.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>Documenttitle>
head>
<body>
<script src="axios.min.js">//这个是引入axios()的,用于发送axaj请求script>
<script src="md5.min.js">//这个是引入md5()方法的,用于加密密码script>
<script src="qs.js">//这个是引入Qs.stringify()方法的,用于把普通对象转成query格式字符串的script>
<script src="http.js">script>
<script>
axios.get("/api/articleList",{
params:{
date:"2021-05-21"
}
}).then(value=>{
console.log(value);
}).catch(err=>{
console.log(err);
})
axios.get("/api/swiper")
.then(value=>{
console.log(value);
}).catch(err=>{
console.log(err);
})
axios.post("/user/login",{
account:"18310612838",
password:md5("1234567890")
},{
//自己配置的属性,优先级高于提取的部分
baseURL:"http://127.0.0.1:9999"
}).then(value=>{
console.log(value)
}).catch(err=>{
console.log(err)
})
script>
body>
html>
axios.defaults.xxx 默认配置
统一配置默认配置-baseURL
统一配置默认配置-超时时间
统一配置默认配置-跨域资源凭证
统一配置默认配置-状态码的范围设置
axios.defaults.validateStatus = function (status) {
return status >= 200 && status < 400;
};
统一配置默认配置-transformRequest
post类统一生效,虽然get类也相当于设置了,但get类请求并不会使用这里
//判断对象是不是纯对象
const isPlainObject = function isPlainObject(obj) {
let proto, Ctor;
if (!obj || Object.prototype.toString.call(obj) !== "[object Object]")
return false;
proto = Object.getPrototypeOf(obj);
if (!proto) return true;
Ctor = proto.hasOwnProperty("constructor") && proto.constructor;
return typeof Ctor === "function" && Ctor === Object;
};
axios.defaults.transformRequest = function (data) {
//纯对象 {}---》urlencoded
if (isPlainObject(data)) {
data = Qs.stringify(data); //是纯对象才会转换//Qs.stringify()方法是外部Qs对象的一个内置方法,需要引入,用于把普通对象转成urlencoded格式的数据。
}
return data;
};
这里统一做某些操作的时机就在请求拦截器里进行
axios.interceptors.request.use(
function (config) {
// 在发送请求之前做些什么
// 发送请求的时候,一般会在请求头里统一配置 token
// let token=...
// if(token){
// config.headers.authorzation=token
// }
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
}
);
服务器----- 统一做某些操作 ----客户端
axios.interceptors.response.use(
function (response) {
// 对响应数据成功的返回值做点什么
//console.log(response,"111");
return response.data;
},
function (error) {
//错误
//1. 有状态码
// response--->status--->404/500
//2. 没有状态码的错误
// 2.1 请求超时 code: "ECONNABORTED" response: undefined
// 2.2 断网 BOM对象--->navigator对象(浏览器相关信息)navigator.onLine true 有网
let err = "未知错误";
if (error.response) {
//有状态码错误
switch (error.response.status) {
case 404:
err = "找不到页面";
break;
case 500:
err = "服务器错误";
break;
//....
default:
break;
}
} else {
//没有状态码的错误
if (error.code === "ECONNABORTED") {
err = "请求超时";
} else if (!navigator.onLine) {
err = "没有网络";
}
}
// 对响应错误做点什么
return Promise.reject(err);
}
);
fetch是es6 新增的,其核心并不是XMLHttpRequest。而是一个与XMLHttpRequest平级的基础通信功能。
method: ‘POST’, // *GET(默认get), POST, PUT, DELETE
mode: ‘cors’,是否允许跨域
credentials:是否是否允许携带跨域资源凭证
cache: ‘no-cache’;是否缓存 不缓存no-cache
headers 设置请求头
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: JSON.stringify(data) post类请求的参数
let data={
account:"18310612838",
password:md5("1234567890")
}
fetch("http://127.0.0.1:9999/user/login",{
method:"POST",
mode: 'cors',
credentials:"omit",
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body:Qs.stringify(data)
}).then(response=>{
return response.json()//接收数据,数据格式是json
}).then(value=>{
console.log(value);
})
fetch()返回的Promise实例对象的正确结果的结果值不是一个对象,而是一个Response实例对象。
fetch("./",{
mode: 'cors',
credentials:"omit"
}).then(response=>{
console.log(response)//不会存在数据,必须调用原型上的方法才能获取数据
//原型上的方法,只能执行1次,多了就报错
return response.json()//接收数据,数据格式是json
}).then(value=>{
console.log(value);
})
一般打开一个前端的后台项目,需要用node执行,同时该cmd窗口不能关闭,监听的端口才会起作用
而pm2可以替代node执行一些命令
在pm2关闭窗口后,对应的后台服务仍然开启 除非关闭电脑,或者适用特定的命令关闭
npm i pm2 -g
pm2 list 查看启动的服务
查看全局启动的pm2项目
pm2 list //查看启动的项目
pm2 start xxx.js --name XXX 启动项目
pm2 stop XXX(名称) 关闭XXX服务
pm2 restart XXX 重新启动项目
pm2 delete XXX 删除某个服务
pm2 start all启动所有项目
pm2 log 查看日志
例子
let theUrl1 = `http://127.0.0.1:8848/aaa2023_01/aaa.html?name=lili&age=18#teacher`
let theUrl2 = `http://www.baidu.com/aaa2023_01/aaa.html?name=lili&age=18#teacher`