首页 > 其他分享 >ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

时间:2023-04-24 17:56:18浏览次数:35  
标签:status axios http 请求 响应 拦截器 return

通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下:

  • baseURL:请求前缀
  • timeout:超时时间
  • headers:请求头

默认配置:

import { defineComponent } from 'vue'
import axios from 'axios'

export default defineComponent({
  setup() {

    // 实例 - 默认配置
    const axiosInstance = axios.create({
      baseURL: 'https://some-domain.com/api/',
      timeout: 1000,
      headers: { 
        Authorization: 'Bearer some-token'
      }
    })

    // 简单封装 - get
    function get(url: string) {
        return axiosInstance.get(url).then(res => {
            console.log(res.data)
            return res
        }).catch(err => {
            console.log('Axios error:', err.message)
            return err
        })
    }

    // 暴露其他方法 ...

    return {
      get
      // ...
    }
  }
})

然后,getpost等方法调用的都是这个 axios 实例,所有请求都会默认使用这些配置。

这可以使我们实现诸如:

  • 不同环境使用不同 baseURL
  • 需要鉴权的请求自动添加 Authorization 请求头
  • 配置统一的超时时间避免请求延迟

axios 支持通过 axios.interceptors 配置拦截器。

添加了请求拦截器后,每次调用 axiosInstance 发出的请求都会先通过请求拦截器。
我们可以在这里做一些公共的操作,如:

  • 添加请求头
  • 显示加载动画
  • 存储请求日志等
// 拦截器 - request 请求
axiosInstance.interceptors.request.use(config => {
    let test = {
        vue_token: 'Abc123',
        type: 'json'
    };
    if (test.vue_token) {
        config.headers['Authorization'] = `Bearer ${test.vue_token}`
    }
    if (test.type === 'json') {
        config.headers['Content-Type'] = 'application/json;charset=UTF-8'
    }
    if (test.type === 'file') {
        config.headers['Content-Type'] = 'multipart/form-data'
    }
    return config;
}, err => {
    console.log(err)
    return err
});

在 axios 响应拦截器中检测响应状态码,并在状态码不正确时抛出错误,每次请求得到非 200-300 状态码的响应时,响应拦截器会抛出一个错误,我们可以在请求方法中使用 catch 捕获此错误。

在拦截器中对常见的 HTTP 错误状态码做不同处理,例如:

  • 401 UNAUTHORIZED:未登录,跳转登录页
  • 403 FORBIDDEN:无权限
  • 404 NOT FOUND:资源不存在
  • 500 INTERNAL SERVER ERROR:服务器内部错误等

添加了响应拦截器后,每次请求的响应都会先通过此拦截器。
我们可以在这里做一些公共的操作,如:

  • 处理响应数据
  • 显示/隐藏加载动画
  • 校验响应状态码是否正确
  • 存储响应日志等
// 拦截器 - response 响应
axiosInstance.interceptors.response.use((response) => {
    const status = response.status
    if (status === 401) {
        // 未登录,跳转登录页
        window.location.href = '/login'
    } else if (status >= 400 && status < 500) {
        throw Error(`Client error! Status: ${status}`)
    } else if (status >= 500) {
        throw Error(`Server error! Status: ${status}`)
    }
    return response
})

现在如果 get 请求得到非正常状态码的响应,就会进入 catch 捕获错误信息。

这些拦截器方便我们处理每一个请求响应周期中的逻辑,减少冗余代码。
拦截器是 axios 中很强大的功能,可以大大提高我们封装 axios 的能力。

标签:status,axios,http,请求,响应,拦截器,return
From: https://www.cnblogs.com/vmto/p/17350344.html

相关文章

  • HTTP---响应数据格式
       ......
  • 第138篇:了解HTTP协议(TCP/IP协议,DNS域名解析,浏览器缓存)
    好家伙,发现自己的网络知识十分匮乏,赶紧补一下 这里先举个我生活中的例子欸,作业不会写了,上网搜一下用edge浏览器上bing必应搜一下(百度广告太多了,真不想用百度举例子) 假设这是我们第一次访问bing的首页当我向浏览器中输入https://cn.bing.com/并按下回车浏览器做了什么?(我......
  • spring boot 过滤器、拦截器的区别和使用
    区别:一、过滤器与拦截器的对比1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。3.使用场景不同:灵活性上......
  • cuda编程 转载https://zhuanlan.zhihu.com/p/592721411
     4.相关概念和术语在CUDA编程模型中,两个主要的硬件设备分别为CPU和GPU,它们都有自己专用的内存区域。I主机、设备和异构并行编程CPU连同它的计算机RAM被称为主机(Host)。CPU由于其结构特点非常适合运行串行程序。但CPU的问题是,如果其运行至一部分需要大规模并行运算的代码时,......
  • axios
    引入axiosnpminstallaxios或者直接引入js文件<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>使用axios//通过params设置参数:axios.get('/url',{params:{ID:123}}).then(function(response){......
  • 关于爬虫中所用到的请求拦截器和响应拦截器
    1、首先我们看一下,axios的发包axios=require('axios')//导入axios包//用axios发包,then回来的来处理服务器返回的数据(响应头)//then是axios接收后台返回数据的vuejquery//success是的接收后台返回数据ajaxaxios.get('http://httpbin.org/get').then(fun......
  • SRS流媒体服务器之HTTP-FLV框架分析
    SRS流媒体服务器之HTTP-FLV框架分析链接:https://www.isolves.com/it/cxkf/kj/2021-03-25/37488.html介绍的代码和现版本代码有出处,但对流程序的理解有相当的价值。简要笔记如下。整体的框架:RTMP推流端-----》SRS流媒体服务器(建立SOURCE->生成Consumer->指定封装格式endoder=F......
  • axios发送请求
     1.浏览器前端向服务器发送http请求(请求报文)2.后台服务器接收到请求后,处理请求,向浏览器返回http响应(响应报文)3.浏览器端接收到响应,解析显示响应体或者调用监视回调函数  1.请求行:格式:methodurlGET/product_details?id=2  或者POST/login2.请求头(一般有多个)Host:......
  • Axios
    axios.get('url地址',{params:{参数1:值1,参数2:值2}}).then(function(response){console.log(response);}).catch(function(error){console.log(error);})axios({method:"get",url:"url地址",params:{参数......
  • 解决Since Maven 3.8.1 http repositories are blocked的问题
    在使用Idea社区版时,已经默认带了Maven插件。所以无需额外安装Maven即能使用。进入Idea的Maven插件目录:C:\ProgramFiles\JetBrains\IntelliJIDEACommunityEdition2023.1\plugins\maven\lib\maven3\conf编辑setting.xml文件,并注释以下内容: <!--<mirror><id......