产品目录 责任编辑如是说axios的特征,单纯的操作方式,可实用性特性,标准化的PCB(适宜项目投资)和许多高阶操作方式,比如说中止允诺,上载文档,xsrf反击防卫。
序言 做为两个后端码农,如果知道 Ajax(Asynchronous JavaScript and XML,即触发器互联网允诺)控制技术的再次出现对那时后端控制技术产业发展是非常大的推动的。但对相同的应用程序对ajax的全力支持并相同,须要标准化相容api,所以 ajax 初始化USB很难逐步形成反弹冥界。 因而 axios 陨落,接下去我将如是说 axios 的特征和使用者,并有适当的范例。「Axios特征」
从应用程序中建立 XMLHttpRequests从 node.js 建立 http 允诺全力支持 PromiseAPI截击允诺和积极响应切换允诺统计数据和积极响应统计数据中止允诺手动切换 JSON 统计数据应用程序全力支持防卫XSRF「Axios INS13ZD方式」
npm install axios
GETfunction get(url) {
return axios.get(url, {
method: “get”,
baseURL: “http://localhost:3001”,
params: {},
timeout: 1000,
timeoutErrorMessage: “允诺延时”,
});
}
恒定回到
允诺延时
POSTfunction post(url, data) {
return axios.post(url, data, {
baseURL: “http://localhost:3001”,
timeout: 1000,
timeoutErrorMessage: “允诺延时”,
});
}
应用程序端服务端
「Axios 实用性」
AxiosRequestConfig允诺特性实用性configdefaultRemark「Axios 标准化PCB」
注: 当我们开发前后台分离项目时,我们会初始化很多服务,如果每次都基础方式初始化,不方便管理所以存在代码重复,也不方便公共操作方式的实现,比如说每次初始化服务前组装服务允诺头信息等等 方式一import axios from “axios”;
import { cookie } from “levenx-utils”;
const defaultConfig = {
baseURL: {
normal: “http://localhost:3001”,
mock: “https://www.easy-mock.com/mock/5d2340fc05020b09e165b709/bookService”,
},
timeout: 5000,
method: “get”,
silent: true,
isMock: false,
};
export default class Axios {
static request(options) {
options = Object.assign({}, defaultConfig, options);
const {
isMock,
baseURL,
timeout,
url,
method,
params,
data,
//不显示loading
silent,
} = options;
let loading;
if (!silent) {
loading = document.getElementById(“ajaxLoading”);
if (loading) {
loading.style.display = “block”;
}
}
return axios({
url,
method,
baseURL: isMock ? baseURL[“mock”] : baseURL[“normal”],
timeout,
params,
data,
headers: {
Authorization: cookie.get(“authorization”),
},
})
.then((response) => {
//设置token
if (response.headers.authorization) {
cookie.set(“authorization”, response.headers.authorization);
}
if (!silent) {
loading = loading || document.getElementById(“ajaxLoading”);
if (loading) {
loading.style.display = “none”;
}
}
if (response.status === 200) {
let res = response.data;
return res;
} else {
return response.data;
}
})
.catch((error) => {
if (!silent) {
loading = loading || document.getElementById(“ajaxLoading”);
if (loading) {
loading.style.display = “none”;
}
}
alert(`提示:${error.message}`);
});
}
static get(url, options = {}) {
return Axios.request(Object.assign({}, options, { url }));
}
static post(url, data, options = {}) {
return Axios.request(
Object.assign({}, options, { url, data, method: “post” })
);
}
}
允诺效果 方式二import axios from “axios”;
const config = {
baseURL: “http://localhost:3001”,
timeout: 50000,
};
// 建立axios实例
var instance = axios.create();
//延时设置
instance.defaults.timeout = config.timeout;
instance.defaults.baseURL = config.baseURL;
//设置form头特性
instance.defaults.headers.post[“Content-Type”] =
“application/x-www-form-urlencoded;charset=UTF-8”;
//request 截击器,标准化处理允诺对象
instance.interceptors.request.use(
(config) => {
// 标准化允诺头处理
const token = “token”;
token && (config.headers.Authorization = token);
return config;
},
(error) => {
return Promise.error(error);
}
);
//response 截击器,标准化处理积极响应对象
instance.interceptors.response.use(
(response) => {
if (response.status === 200) {
return Promise.resolve(response.data);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是200的情况
(error) => {
if (error.response && error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后回到当前页面,这一步须要在登录页操作方式。
case 401:
console.info(“跳转登录页”);
break;
// 403 token过期
// 登录过期对使用者进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
console.info(“跳转登录页登陆过期”);
// 清除token
localStorage.removeItem(“token”);
// store.commit(loginSuccess, null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转须要访问的页面
setTimeout(() => {
console.info(“跳转过期”);
}, 1000);
break;
// 404允诺不存在
case 404:
console.info(“404”);
break;
// 其他错误,直接抛出错误提示
default:
console.info(“其他错误”);
}
return Promise.reject(error.response);
}else {
return Promise.reject(error.message);
}
}
);
export default instance;
允诺效果
「Axios 高阶玩法」
中止允诺import axios from “axios”;
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
Axios.post(
“/levenx/common/post”,
{
name: “levenx”,
},
{ cancelToken: source.token }
)
.then((res) => {
debugger;
})
.catch((err) => {
alert(err);
return err;
});
debugger;
source.cancel(“中止允诺”);
文档上载// 上载方法
function upload(url, file) {
let config = {
headers: { “Content-Type”: “multipart/form-data” },
baseURL: “http://localhost:3001”,
};
let data = new FormData();
data.append(“file”, file);
return axios.post(url, data, config);
}
//react.js
class Login extends Component {
async componentDidMount() {}
//上载按钮触发上载动作
upload = async () => {
const { file } = this.state;
let result = await upload(“/levenx/common/upload”, file);
};
render() {
return (
<div>
<input
type=file
onChange={(e) => {
// 监听文档变化
this.setState({ file: e.currentTarget.files[0] });
}}
/>
<button onClick={this.upload}>上载</button>
</div>
);
}
}
备注:上载图片后端代码可以参考之前写的博客。ajax图片上载功能实现(点击,拖拽,粘贴)Koa服务端XSRF 防卫 CSRF 反击的原理,就是利用由于应用程序的同源策略对 script 、img、video、audio等嵌入资源不做限制的行为进行跨站允诺伪造的。 具体的XSS、CSRF反击会单独记录,敬请关注。// xsrf 实用性
function get(url) {
return axios.get(url, {
method: “get”,
baseURL: “http://localhost:3001”,
params: {},
timeout: 1000,
timeoutErrorMessage: “允诺延时”,
//xsrf
withCredentials: true,
xsrfCookieName: “XSRF-TOKEN”,
xsrfHeaderName: “X-XSRF-TOKEN”,
});
}
//服务端验证
static async home(ctx) {
const header = ctx.header;
const cookie = ctx.cookies;
console.log(“x-xsrf-token:”, header[“x-xsrf-token”]);
console.log(“XSRF-TOKEN”, cookie.get(“XSRF-TOKEN”));
return {
code: 0,
message: “首页”,
};
}
服务端效果图
判断是否存在xsrf反击 判断header中 header[“x-xsrf-token”] 与 cookie.get(“XSRF-TOKEN”) 是否存在并且相等。 比如说
图片上载失败
重试
也会发起服务,但header特性并不会存在 x-xsrf-token。
模拟xsrf反击
<img src=http://localhost:3001/levenx/common />
<img src=http://localhost:3001/levenx/common />, cookie可以读取,但header中缺少特性,从而可以防卫xsrf。axios提供快捷的方式设置 header 特性,如开局代码展示。
文档上载进度条onUploadProgressfunction upload(url, file) {
let config = {
headers: { “Content-Type”: “multipart/form-data” },
baseURL: “http://localhost:3001”,
//上载进度条处理
onUploadProgress: ({ loaded, total }) => {
console.log(“loaded:”, loaded);
console.log(“total:”, total);
console.log(“百分比:”, (loaded / total) * 100 + “%”);
},
};
let data = new FormData();
data.append(“file”, file);
return axios.post(url, data, config);
}
普通人还在犹豫的时候,好看的人已经一键三连咯~ 公众号:「 乐闻世界 」