1. axios的基本封装
2. axios中类get的post
3. promise.then().catch()和第二个回调的区别
1. axios实例
安装axios库 npm install axios
or yarn add axios
or CDN <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
| |
| import axios from 'axios' |
| import Cookies from 'js-cookie' |
| import { Notification, MessageBox, Message, Loading } from 'element-ui' |
| import { getToken } from '@/utils/auth' |
| |
| |
| const service = axios.create({ |
| baseURL: process.env.VUE_APP_BASE_API, |
| timeout:, |
| |
| }) |
| |
| |
| |
| export default service |
2. 请求拦截器
| |
| service.interceptors.request.use( |
| config => { |
| |
| if (getToken()) { |
| config.headers['Authorization'] = getToken() |
| } |
| |
| |
| config.headers['Content-Type'] = '’application/json;charset=utf-8' |
| |
| if () { |
| config.headers['xxx'] = Cookies.get('xxx') |
| } |
| return config |
| }, |
| error => { |
| |
| Promise.reject(error) |
| } |
| ) |
auth.js
| import Cookies from 'js-cookie' |
| import Config from '@/settings' |
| |
| const TokenKey = Config.TokenKey |
| export function getToken() { |
| return Cookies.get(TokenKey) |
| } |
2. 响应拦截器的两个函数参数的参数
2.1 response对象的结构
ajax请求对象
| response: { |
| config:{}, |
| headers:{}, |
| request:{ |
| readyState:4, |
| responseType:'', |
| status:200, |
| statusText:'' |
| } |
| statusText:'', |
| status:200, |
| data:{ |
| { |
| code:0, |
| data:{}, |
| message:'' |
| } |
| }, |
| } |
2.2 error对象的结构
| { |
| message:'', |
| code:'', |
| response:{}, |
| |
| } |
3. 响应拦截器
| |
| service.interceptors.response.use( |
| response => { |
| |
| |
| if(response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer'){ |
| return response.data |
| } |
| |
| |
| |
| |
| |
| const { code, msg, data } = response.data || {} |
| if() { |
| return Promise.reject('error') |
| Message.error(msg ? msg : 'xxx') |
| } else if() { |
| return Promise.reject('error') |
| Message.error(msg ? msg : 'xxx') |
| } else { |
| return data |
| } |
| }, |
| error => { |
| |
| if(){ |
| } |
| |
| |
| else { |
| try { |
| |
| const status = error.response.status |
| } catch(err) { |
| |
| if(error.code === 'ECONNABORTED' || error.message === "Network Error" || error.message.includes("timeout"){ |
| Message({ |
| message: '网络超时,请稍后重试', |
| type: 'error', |
| duration: 3000 |
| }) |
| } |
| } |
| let errMsg = '未知错误' |
| switch(status){ |
| case 401: |
| errMsg = '未授权,请重新登录' |
| |
| |
| |
| break; |
| case 403: |
| errMsg = '拒绝访问' |
| break; |
| case 408: |
| errMsg = '请求超时' |
| break; |
| case 500: |
| errMsg = '服务端出错' |
| break; |
| case 502: |
| errMsg = '网关错误' |
| break; |
| default: |
| errMsg = `其它连接错误:${status}` |
| break; |
| |
| } |
| Message.error(errMsg) |
| } |
| |
| else if(axios.isCancel(err)) { |
| |
| } |
| |
| |
| |
| return Promise.reject(error) |
| } |
| ) |
JSON 是 JS 对象的字符串表示法,JS对象转JSON:JSON.stringify(obj)
,JSON转JS :JSON.parse(text);
也可以用于深拷贝对象
4. 接口调用
| |
| export function getList(form,id,unitId) { |
| return request({ |
| url:'', |
| method:'', |
| data:form, |
| params:{ |
| id,unitId |
| }, |
| }) |
| } |
| |
| |
| |
| getList().then(res => { |
| console.log(res) |
| }).catch(err => { |
| |
| console.log(err) |
| }) |
附:Promise.then().catch() 和 第二个回调的区别
主要区别就是:如果在 .then 的第一个函数里抛出的异常,后面的 .catch 能捕获到,而 .then 的第二个函数捕获不到;
- resolve 后的,一定会进入 then 的第一个回调,肯定不会进入 catch
- reject 后的,会先进入 then 中的第二个回调,如果 then 中没有写第二个回调,则进入 catch
- new Promise 时(抛出)的异常,如果 .then 有第二个回调,是会就近捕获的
- then 第一个回调内(抛出)的异常,只有 catch 可以捕获
| |
| const p1 = new Promise((resolve, reject) => { |
| resolve('成功!'); |
| }); |
| |
| p1.then( |
| (value) => { |
| console.log(value); |
| throw new Error('噢,不!'); |
| }, |
| (err) => { |
| console.log(err.message, 'then2'); |
| } |
| ).catch((e) => { |
| console.error(e.message, 'catch'); |
| }); |
| |
| const p1 = new Promise((resolve, reject) => { |
| throw new Error('errrr'); |
| resolve('成功!'); |
| }); |
| |
| p1.then( |
| (value) => { |
| console.log(value); |
| }, |
| (err) => { |
| console.log(err.message, 'then2'); |
| } |
| ).catch((e) => { |
| console.error(e.message, 'catch'); |
| }); |
附:axios的post请求像get请求一样,不在请求体中携带数据而是在路径中传参
| getById(id){ |
| return request({ |
| url:`xxx/getById`, |
| method: 'get', |
| params:{ |
| id |
| } |
| }) |
| }, |
params,参数就会出现在 query string paramter 中
data,请求content-type为application/json,请求体见Request Payload
data,请求content-type为application/x-www-form-urlencoded,参数见Form Data
本文作者:雨宮莲
本文链接:https://www.cnblogs.com/pupyy/p/17928335.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步