当前位置:   article > 正文

axios和ts的简单使用

axios和ts的简单使用

按照官网的使用案例简单记下笔记

1:安装

npm install axios

2:案例

一个简单的config配置信息

  1. // 发起一个post请求
  2. axios({
  3. method: 'post',
  4. url: '/user/12345',
  5. data: {
  6. firstName: 'Fred',
  7. lastName: 'Flintstone'
  8. }
  9. });

case 

  1. // 在 node.js 用GET请求获取远程图片
  2. axios({
  3. method: 'get',
  4. url: 'http://bit.ly/2mTM3nY',
  5. responseType: 'stream'
  6. })
  7. .then(function (response) {
  8. response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  9. });

上面都是官网的案例

在实际的项目中,在使用axios请求时,都会进行数据封装。

3:创建实例

封装一些耦合度高的请求配置

config.ts文件

封装一个基础的请求头配置,使用axios中内置的ts类型 AxiosRequestConfig属性限制

  1. import { API_BASE_URL } from '@/utils/env'
  2. import { AxiosRequestConfig } from 'axios'
  3. const baseURL = API_BASE_URL
  4. const axiosConfig: AxiosRequestConfig = {
  5. baseURL,
  6. // 请求超时时间
  7. timeout: 30 * 1000,
  8. // 跨域是否带token
  9. withCredentials: true,
  10. showMessageOnReject: true,
  11. }
  12. export default axiosConfig

创建实例

  1. import config from './config'
  2. const axiosInstance = axios.create(config)

4:发起请求前的处理

  1. axiosInstance.interceptors.request.use(
  2. (config) => {
  3. const token = getToken()
  4. if (token) {
  5. ;(config.headers as AxiosRequestHeaders).Authorization = `Bearer ${token}`
  6. ;(config.headers as AxiosRequestHeaders)['X-ECAPI-UserAgent'] = getUserAgent()
  7. }
  8. return config
  9. },
  10. (error) => {
  11. return Promise.reject(error)
  12. }
  13. )

在发起请求前,添加headers,配置身份信息

在请求头部添加UserAgent:X-ECAPI-UserAgent

在使用Akamai的API时,通常需要设置X-ECAPI-UserAgent头部来标识API的调用者。这样做可以帮助Akamai识别是谁在调用API,并可能用于日志记录或者访问控制。

 5:接口返回值

  1. // @TODO: 两处reject的reason做个包装,通过一个标识符,使得业务代码可以区分走的是哪个reject
  2. axiosInstance.interceptors.response.use(
  3. (res: AxiosResponse<BaseResponse>) => {
  4. console.log('router', router)
  5. console.log('location.href', location.href)
  6. if (res.data.code !== ResponseCode.Success) {
  7. // 2. HTTP状态码200,但业务code !== ResponseCode.Success, promise 会被 reject
  8. if (res.data.code === ResponseCode.InvalidToken) {
  9. // 业务代码
  10. } else if (res.data.code === ResponseCode.appDisabled) {
  11. // 业务代码
  12. router.push('/404')
  13. } else {
  14. // 业务代码
  15. }
  16. return Promise.reject(res)
  17. }
  18. // 1. 当且仅当业务code === ResponseCode.Success的情况下, promise 才会被 resolve
  19. return res
  20. },
  21. (error: AxiosError) => {
  22. // 3. HTTP状态码非200 || 网络异常 || 其它未被捕获的错误, promise会被 reject
  23. if (error.config && error.config.showMessageOnReject) {
  24. if (error.response?.status === 500) {
  25. Toast('服务异常,请稍后重试')
  26. } else {
  27. Toast('网络异常,请稍后重试')
  28. }
  29. }
  30. return Promise.reject(error)
  31. }
  32. )

这里的ResponseCodeBaseResponse是项目自定义的类型限制,不是axios中内置的;

6:AbortController的简单介绍

这里有一个中止请求的方法,使用AbortController,在网上看到别人说的使用方法:

认识 AbortController控制器对象 及其应用-CSDN博客

案例

  1. type EnhancedPromise<T> = Promise<T> & {
  2. abortController: AbortController
  3. }
  4. export const get = (url: string, params: Recordable = {}, config?: AxiosRequestConfig) => {
  5. const controller = new AbortController()
  6. const promise = new Promise((resolve, reject) => {
  7. axiosInstance
  8. .get<BaseResponse, AxiosResponse<BaseResponse, Recordable>, Recordable>(url, {
  9. params,
  10. signal: controller.signal,
  11. ...config,
  12. })
  13. .then((res) => {
  14. resolve(res)
  15. })
  16. .catch((err: AxiosError) => {
  17. reject(err)
  18. })
  19. }) as EnhancedPromise<AxiosResponse<BaseResponse, Recordable>>
  20. promise.abortController = controller
  21. return promise
  22. }
  23. export const post = (url: string, data: Recordable = {}, config?: AxiosRequestConfig) => {
  24. const controller = new AbortController()
  25. const promise = new Promise((resolve, reject) => {
  26. axiosInstance
  27. .post<BaseResponse, AxiosResponse<BaseResponse, Recordable>, Recordable>(url, data, {
  28. signal: controller.signal,
  29. ...config,
  30. })
  31. .then((res) => {
  32. resolve(res)
  33. })
  34. .catch((err: AxiosError) => {
  35. reject(err)
  36. })
  37. }) as EnhancedPromise<AxiosResponse<BaseResponse, Recordable>>
  38. promise.abortController = controller
  39. return promise
  40. }

覆盖axios原有的post和get方法

7:使用

7.1 没有覆盖post和get方法的使用方式

使用axios原有的post和get方式发起请求

  1. import request from '@/request'
  2. // 查询
  3. export const findCategoryTree = ({ categoryId = 0 }: Recordable) => {
  4.   return request.post(`/manager`, { categoryId })
  5. }

7.2覆盖了post和get方法的使用方式 

  1. import { get, post } from '@/http'
  2. import { AxiosRequestConfig } from 'axios'
  3. // 短信验证码登录
  4. export const signin = (data: Recordable, config?: AxiosRequestConfig) => {
  5. return post(`/member/login`, data, config)
  6. }

8:typescript的介绍

axios提供的内置类型声明,查看路径node_modules/axios/index.d.ts

import axios, { AxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestHeaders } from 'axios'
  • AxiosResponse:接口响应值类型限制
  • AxiosError:接口响应失败情况下的类型限制处理

  • AxiosRequestHeaders 接口请求头类型限制

  • AxiosRequestConfig 接口请求的基本配置类型限制

简单记录下vue3 + axios + ts 的基本封装

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/677909
推荐阅读
  

闽ICP备14008679号