首页 > 其他分享 >AXIOS的封装拦截以及API接口管理详解

AXIOS的封装拦截以及API接口管理详解

时间:2024-04-19 16:45:03浏览次数:25  
标签:axios 封装 AXIOS API localStorage KEY reject return

在我们做vue项目时,使用axios请求数据已经是司空见惯了,它是基于promise的http库,可以运行在浏览器和nodejs中,其实他有很多的优秀特性,例如,请求拦截,响应拦截,以及取消请求,json转换,客户端防御XSRF等,所以尤大大直接推荐我们使用axios库。

我们先看axios如何封装,首先我在src下创建requestjs文件,这个文件里面我主要对axios进行封装,然后是methodjs,这个文件主要对post和get方法进行封装,再有一个apijs文件,这个文件存放后端的所有接口,也就是说,公共管理接口,在创建一个localjs文件,这个文件对localstorage进行封装,这些写完之后我们再写一个tokenjs,这个文件管理token。

先来看看requestjs,在这里我只对axios的请求以及他的响应进行了拦截,直接来看代码:

import axios from 'axios'     //引入axios
import { GETTOKEN } from './token'    //引入获取token的方法
const instance = axios.create({
    timeout:15000,      //开始创建axios的请求时间
    // baseURL:'http://localhost:9005'   //这个默认的url可以不去写
});
//请求拦截
instance.interceptors.request.use(    //开始对请求进行拦截
    config => {
        if(GETTOKEN()){    //判断是否存在token,如果存在我们将其在头部进行发送
            config.headers = {   //headers的值
                'Content-Type':'application/x-www-form-urlencoded',
                'Authorization': GETTOKEN()
            };
        }    //我们将参数返回出来
        return config
    },error =>{
        Promise.reject(error)   //如果错误,我们则使用Promise异步方法将error输出
    }
);
//响应拦截
instance.interceptors.response.use(
    (response) => {    //response的拦截
        if (response.data && response.data.code && response.data.code !== 200) {    //首先要判断他的值以及他的code值,如果是200,等真确的码则将response返回出来,如果是错误的就使用Promise方法将错误输出
            Promise.reject(error)
        }
        return response
    }, (error) => {
        return Promise.reject(error)  //将错误信息返回给前端页面
    }
);
export default instance   //导出所有axios的定义

接下来看methodjs,针对他的post和get方法的封装:


/**
 * 整体导出
 * 我们在使用promise时,在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法,通过 .catch 能够清楚的判断出promise链在哪个环节出了问题
 */
export default {
    //异步加载,返回一个promise对象,
    GETMETHOD(url,param){
        return new Promise((resolve, reject)=>{
            request({
                url:url,
                method:'GET',
                params:param
            }).then((res) => {
                resolve(res)  //使用resolve将结果输出,返回promise对象,
            }).catch((error) => {
                reject(error)   //使用reject,promise不执行,调用catch方法。将错误信息输出前端页面。
            })
        })
    },
    POSTMETHOD(url, param) {
        return new Promise((resolve, reject) => {
            request({
                url: url,
                method: 'POST',
                params: param
            }).then((res) => {
                resolve(res)
            }).then((error) => {
                reject(error)
            })
        })
    }
}

现在我们来看apijs,这个里面是对接口的管理,写法很简单,就是将接口写在这里面:


/**
 * url地址的封装
 */
export default {
    LOGINURL:'/userApi/login'
}`

我们再来看localjs,对localstorage进行封装,在这里,我封装了他常用的四个方法,获取、存储、删除、清空是个方法:
`export default {
    /**
     * 在localStorage中没有设置失效时间的,只能设置key和value
     * 存储
     * @param KEY
     * @param VALUE
     * @param TIME
     */
    set(KEY,VALUE,TIME) {
       if (typeof KEY !== 'string') {  //判断key值是否是字符串
           console.log("*STORAGE ERROR* key必须是字符串");
           return;
       }
      if (TIME) {  //判断是否传入时间
           if (typeof TIME !== 'number') {   //判断key值是否是数字字符串
               console.log("*STORAGE ERROR* time必须是数字");
           } else {
               TIME = parseInt(TIME) + (new Date()).getTime();
           }
      } else {
          TIME = null;
      }
      var setValue = {  //因为这个没法设置时间,所以在这里我们存value时,将value存为对象
          value: JSON.stringify(VALUE),
          time: TIME
      };
        localStorage.setItem(KEY, JSON.stringify(setValue));  //转成字符串的对象
    },
    /**
     * 获取
     * @param KEY
     * @returns {*}
     */
    get(KEY) {//先获取存储的值
        var getValue = JSON.parse(localStorage.getItem(KEY));
        if(!getValue){//判断是否有值
            return null
        }
        if (getValue.time && getValue.time < (new Date()).getTime()) { //判断时间等于或者小于现在时间时删除localStorage,并将其置为null
            localStorage.remove(KEY);
            return null;
        } else {
            return JSON.parse(getValue.value)  //反之,这就将value值return出来
        }
    },
    /**
     * 删除
     * @param KEY
     */
    remove(KEY) {//使用localStorage方法,直接删除
        localStorage.removeItem(KEY);
    },
    /**
     * 清空
     */
    clear() {//使用localStorage方法,直接清空
        localStorage.clear();
    }
}

最后我们看看tokenjs,也就是token的存储,调用localStorage封装的方法就可以:

/**
 * token的封装
 */
// import cookie from 'js-cookie'
    import localStorage from './local'
 
 
const LOGINTOKEN = 'USERTOKEN'  //定义key值
 
export  function GETTOKEN(){   //获取token
    localStorage.get(LOGINTOKEN)
}
 
export function SETTOKEN(val,time) {   //存储token携带时间
    localStorage.set(LOGINTOKEN,val, { expires: time });
}
 
export function REMOVETOKEN() {   //删除token
    localStorage.remove(LOGINTOKEN)
}

axios的封装就到这里,可以参考该地址:https://github.com/jiab7413/webpack-axios,pack为webpack服务配置,server为后台配置,axios在pack文件下的src下

标签:axios,封装,AXIOS,API,localStorage,KEY,reject,return
From: https://www.cnblogs.com/ly369/p/18146321

相关文章

  • IIS 部署WEBAPI
    ASP.NETCore不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NETCore程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达......
  • 比较RPC和RESTful API的优缺点
    RPC和RESTfulAPI是两种不同的远程调用方式,它们各自具有不同的优缺点。RPC的优点包括:高效:RPC使用自定义的通信协议,可以减少报文传输量,提高传输效率。灵活:RPC支持多种语言,不同的编程语言可以方便地调用远程接口。通用:RPC可以基于XML、JSON等标准化的数据格式进行通信,使得不同......
  • NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落
    NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(SpidervsBIRD)全面对比优劣分析[Text2SQL、Text2DSL]NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法......
  • 界面组件库DevExpress Office File API(WinForms & WPF)v24.1新功能预览
    本文描述了界面组件库DevExpress的OfficeFileAPI(WinForms&WPF)和受Office启发的控件在v24.1中发布的一些功能,并详细介绍了我们当前的抢先体验预览版本v24.1中的内容。DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress......
  • 酷狗音乐KRC歌词接口api
    解析酷狗官方KRC歌词接口APIKRC可用API接口kugou已经解决:搜索歌曲:http://ioscdn.kugou.com/api/v3/search/song?keyword=关键字&page=1&pagesize=40&showtype=10&plat=2&version=7910&tag=1&correct=1&privilege=1&sver=5搜索歌词krc:http://krcs.kugou.com/......
  • Web Audio API 第5章 音频的分析与可视化
    到目前为止,我们仅讨论了音频的合成与处理,但这仅是WebAudioAPI提供的一半功能。另一半功能则是音频的分析,它播放起来应该是什么样子的。它最典型的例子就是音频可视化,但其实有更多的其它应用场景,包括声调检测,节减检测,语音识别等,这些已大大超出本书范围。对于游戏或交互式应用......
  • webapi路由
    ShopController.cspublicclassShopController:ApiControllerBase{[Route("api/v1/shop/watermark")][HttpPost]publicApiResultwatermark(dynamicvalue){//watermark/shopname.txtA......
  • blender python api 使用脚本修改动画关键帧的属性值
    1.代码1-将动画关键帧中的所有Y轴都设置为1.0,代码:importbpy#设置重置到的Y坐标值reset_to=1.0#遍历所有当前选中的对象forobjectinbpy.context.selected_objects:#如果对象没有动画,我们也应该重置其Y坐标object.location.y=reset_to#检......
  • vue3+elementplus+axios+router的入门项目总结
    一、使用vite方式创建项目:1、创建空文件夹,用vscode打开空文件夹,终端上运行如下命令$npminitvite-app[项目名]:初始化项目$cd[项目名]:进入项目$npminstall:安装项目依赖$npmrundev:启动项目2、启动项目后会出现访问地址: 3、进入访问地址: 二、引入elementpuls......
  • blender python api 使用脚本批量对obj物体进行渲染(obj所在目录要有与之对应的mtl文件
     代码:importbpy#导入Blender的PythonAPI接口importpathlib#导入pathlib模块,用于操作文件路径#设置OBJ文件所在的目录路径obj_root=pathlib.Path('D:\\ceshi')#注意Windows路径中的斜杠需要转义#取消选择场景中的所有物体,以便导入时不会与已选择的物体冲......