之前介绍过一篇《typescript 配置 axios》。那个版本用了class语法,本次介绍 vue3.0 普通的写法,最后用 eggjs 测试通过登录接口。

./src/api 目录下需要 api.ts、status.ts、type.ts 三个文件。

├── src
│   ├── api
│   │   ├── api.ts
│   │   ├── status.ts
│   │   └── type.ts

./src/api/api.ts

import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from 'axios';
import qs from 'qs'
import { showMessage } from "./status";
import { ElMessage } from 'element-plus'
import { IResponse, ILogin } from './type';let axiosInstance:AxiosInstance = axios.create({baseURL: process.env.VUE_APP_BASE_URL + "/api/v1/",headers: {Accept: "application/json","Content-Type": "application/x-www-form-urlencoded"},transformRequest: [function(data) {//由于使用的 form-data传数据所以要格式化delete data.Authorization;data = qs.stringify(data);return data;}]
});// axios实例拦截响应
axiosInstance.interceptors.response.use((response: AxiosResponse) => {if (response.headers.authorization) {localStorage.setItem('app_token', response.headers.authorization);} else {if (response.data && response.data.token) {localStorage.setItem('app_token', response.data.token);}}if (response.status === 200) {return response;} else {showMessage(response.status);return response;}},// 请求失败(error: any) => {const {response} = error;if (response) {// 请求已发出,但是不在2xx的范围showMessage(response.status);return Promise.reject(response.data);} else {ElMessage.warning('网络连接异常,请稍后再试!');}}
);// axios实例拦截请求
axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {// const { user } = store.state// if (token) {//   config.headers.Authorization = `Bearer ${token}`// }return config;},(error:any) => {return Promise.reject(error);}
) /*** @description: 用户登录* @params {ILogin} params* @return {Promise}*/
export const login = (params: ILogin): Promise<IResponse> => {return axiosInstance.post('user/login',params).then(res => res.data);
};
  • 整体还是创建实例的方式,通过给实例添加请求和响应拦截,做对应处理。
  • axios.createtransformRequest 配置,先删除参数中的 Authorization, 再通过 qs 依赖转换了参数的形式(将对象字面量转化成 Form Data 格式)。
  • 响应拦截中做了对 token 的处理
  • 请求拦截中这请求头部 header 中给 Authorization 添加 token,根据具体业务需求修改。
  • 本文件创建一个登录接口 login 用来测试 eggjs 提供的接口。

./src/api/status.ts

export const showMessage = (status:number|string) : string => {let message:string = "";switch (status) {case 400:message = "请求错误(400)";break;case 401:message = "未授权,请重新登录(401)";break;case 403:message = "拒绝访问(403)";break;case 404:message = "请求出错(404)";break;case 408:message = "请求超时(408)";break;case 500:message = "服务器错误(500)";break;case 501:message = "服务未实现(501)";break;case 502:message = "网络错误(502)";break;case 503:message = "服务不可用(503)";break;case 504:message = "网络超时(504)";break;case 505:message = "HTTP版本不受支持(505)";break;default:message = `连接出错(${status})!`;}return `${message},请检查网络或联系管理员!`;
};
  • status.ts 返回相应状态对应的信息文字。

./src/api/type.ts

// 返回res.data的interface
export interface IResponse {code: number | string;data: any;msg: string;
}/**用户登录 */
export interface ILogin {/** 账户名称 */username: string;/** 账户密码 */password: string;
}
  • type.ts 集中定义各种 api 相关的接口。如果以后接口过多,这个文件可能会很臃肿,如果哪位大神还有其他优化文件夹目录方式,欢迎一起讨论。

前端测试接口的话,和上次一样还是用 /src/views/Home.vue 中

import { defineComponent, onMounted } from 'vue';
import { login } from '@/api/api';
export default defineComponent({name: 'Home',setup() {onMounted(()=>{login({username:'admin',password:'123456'});})}
});

最后是调用 eggjs 提供的接口,关于 eggjs 这里不做过多介绍,参照官方文档写个demo也不算复杂。

  • eggjslogin 接口地址是 http://localhost:7001/api/v1/user/login
  • 我的 env 配置文件中的 VUE_APP_BASE_URL 是 http://0.0.0.0:7001。 这样可以调用接口。

接口返回的数据通过 ./src/api/api.ts 处理的返回结果(res.data)如下:

{"code": 200,"msg": "登录成功","data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InNvbmljIiwiaWF0IjoxNjE4OTc0NDQzfQ.XtKLR2_AHFq0r5we71V7BWVtXvQLeYu2OGYv-w8iZEM"}
}

vue3.0 ts版项目配置axios相关推荐

  1. 如何搭建一个完整的Vue3.0 + ts 的项目

    如何搭建一个完整的Vue3.0 + ts 的项目 相信9月18日尤大大的关于Vue3.0的发表演讲大家一定有所关注,现在Vue3.0 也已经进入RC阶段(最终产品的候选版本,如果没有问题则可发布成为正 ...

  2. Vue3+Vite+TS后台项目 ~ 4. axios请求封装

    一.axios封装 1. request 请求封装 新建 src / utils / request.ts 文件: import axios from 'axios'const request = a ...

  3. vue3.0+ts+element-plus多页签应用模板:项目搭建

    目录 系列文章 一.安装vue-cli@4.5.x 二.创建项目 三.项目配置 四.IDE配置 五.vue.config.js配置 六.重置浏览器默认样式 系列文章 vue3.0+ts+element ...

  4. Vue3.0+TS+Element-plus实现(若依版后台管理系统)

    附上源码地址: Vue3.0+TS+Element-plus 后台管理系统模板 准备工作 安装vue3.0,npm create vue3-project 选中这几项即可,不需要vuex, 我们自己封 ...

  5. vue 不识别svg_vue中引用svg,vue引入svg不显示,vue引用svg配置,vue3.0+ts如何配置svg...

    注意: 如果按照下面配置正确发现svg依然无法显示可能s'v'g-sprite-loader的版本过高,重新指定版本下载npm i svg-sprite-loader@3.8.0 --save-dev ...

  6. vue3.0+ts+element-plus多页签应用模板:侧边导航菜单(上)

    目录 系列文章 一.先说点什么 二.从问题开始,侧边栏是干啥的? 三.封装组件之思路分析 四.封装菜单部分 1. MenuItem 2. ModuleMenu 系列文章 vue3.0+ts+eleme ...

  7. vue3.0+ts+element-plus多页签应用模板:element-plus按需引入与动态换肤

    目录 系列链接 一.安装element-plus 二.按需引入 1. 为什么要按需引入? 2. 如何按需引入? 3. 验证是否引入成功 三.动态换肤 1. 制作自定义主题 2. 引入自定义主题 3. ...

  8. vue3.0+ts+element-plus多页签应用模板:多级路由缓存

    目录 系列文章 一.先说点啥 1. 为啥需要路由缓存? 2. 怎么实现路由缓存? 二.路由扁平化 三.定义tag模块处理路由缓存 四.切换路由时加入缓存 五.使用keep-alive 系列文章 vue ...

  9. React项目配置axios和反向代理和process.env环境配置等

    React项目配置axios和代理和proces.env环境配置等 React项目配置axios和代理和proces.env环境配置等 配置axios和代理 proces.env环境配置 React项 ...

  10. 支持vue3.0+ts 的富文本记录

    前言 用过很多的富文本,还是蛮喜欢鹅毛富文本,轻量级, 一般遇到富文本的案例,都会首先想到的是quill 目前vue3.0与react分裂两极,typescript霸占一方,javascript还在坚 ...

最新文章

  1. JSP/Servlet 工作原理
  2. mysql退出当前数据库,再次 show databases
  3. php函数有哪三种,【后端开发】php函数可以分为哪三种
  4. kattis ones简单题取模运算+枚举
  5. mysql root 无法建立数据库_MySQL - 在root用户下你跟我说无法建表!?
  6. Hadoop异常 hdfs.DFSClient: DataStreamer
  7. python变量后面加星号_Python开发中关于参数使用的几点建议 -- 1
  8. 使用nutch爬取数据时出现的问题_在使用聚氨酯发泡机时出现问题的解决方法!...
  9. 【学习总结】数学-基本计数方法
  10. MFC修改窗口无标题和标题信息,修改执执行文件图标
  11. VS调试按钮和运行按钮无法使用
  12. 中国农业银行总行西安成都软件开发中心笔试面试流程
  13. Arduino 高级教程 01:基础篇
  14. 大类资产配置(二)风险预算及风险平价模型
  15. java面向对象抽象类和接口
  16. 小米抢注mi.io域名 “雷布斯”要做小米小程序?
  17. layui table 每列加标签_【前端】layui表格中根据条件给对应的列加背景色
  18. 2017年4月11日携程笔试题 拼图
  19. ClickHouse 在爱奇艺实时数仓的应用
  20. EasyX颜色+绘制彩虹色天空

热门文章

  1. Python源文件改写。编写一个程序,读取一个Python源程序文件source.py,将文件中所有除保留字外的小写字母换成大写字母。生成后的文件要能够被Python解释器正确执行。
  2. java stringbuilder 构造函数_java---StringBuilder类的用法(转载)
  3. videobox,一个错误的名字
  4. 计算机领域中dns是什么意思,dns错误是什么意思?dns错误要如何解决?
  5. 深入理解AX Inventory Aging Report
  6. TDS:标签平台+API平台+数据共享平台,助力数据运营平台建设
  7. 使用scrapy爬取豆瓣上面《战狼2》影评
  8. TC118AH单通道内置MOS单通道直流无刷马达驱动IC
  9. gta4光影补丁_侠盗猎车4 L3EVO87中低配光影ENB MOD
  10. 苹果手机可以微信分身吗_微信和微信分身版有区别吗