vue---Axios网络请求封装

一、封装意义

封装是因为axios使用率实在是太高了,为了程序后期的可维护性,我们会把同样的东西放在一起,后期找起来会很方便,这就是封装的主要意义。在日常应用过程中,一个项目中的网络请求会很多,此时一般采取的方案是将网络请求封装起来。

二、拦截器

拦截器最常用,因为在发送网络请求之前和获取到网络请求给我们返回的数据之前都可能需要把这个请求给拦截一下,做一些额外的处理。

拦截分为两类:①发送数据之前 ②获取数据之前

三、封装过程

1、首先需要安装axios,在终端输入:cnpm install --save axios

2、安装querystring,在终端输入:cnpm install --save querystring

3、启动程序,在终端输入:npm run serve

4、在src中创建一个文件夹叫utils,在utils中创建一个网络请求文件叫request.js 

5、当methods="post"要额外做处理,因为post参数的格式需要我们转化,这个时候就可以放到拦截器里面,日后再使用这个网络请求的时候,就不需要操心格式的问题了。

6、在request.js中输入:

import axios from "axios"
import querystring from "querystring"
const errorHandle = (status,info) =>{
    switch(status){
        case 400:
            console.log("语义有错");
            break;
        case 401:
            console.log("服务器认证失败");
            break;
        case 403:
            console.log("服务器拒绝访问");
            break;
        case 404:
            console.log("地址错误");
            break;
        case 500:
            console.log("服务器遇到意外");
            break;
        case 502:
            console.log("服务器无响应");
            break;
        default:
            console.log(info);
            break;
    }
}

//创建一个属于自己的网络请求的对象
const instance = axios.create({
    //这一块区域放置网络请求的公共配置
    timeout:5000
})

//发送数据之前
//拦截器的对象叫interceptors再通过request(发送的意思),通过use方法处理这个拦截器

instance.interceptors.request.use(
    config =>{
        if(config.methods ==="post"){
            config.data = querystring.stringify(config.data)
        }
        //config包含网络请求的所有信息
        return config;
    },
    error =>{
        return Promise.reject(error)
    }
)

//获取数据之前,response(响应对象)
instance.interceptors.response.use(
    response =>{
        return response.status === 200 ? Promise.resolve(response) : Promise.reject(response)
        //状态码是200就resolve成功,如果不是则reject失败
    },
    error =>{
        const { response } = error;
        errorHandle(response.status,response.info)
    }
)
export default instance;

注:不管是哪个状态码错误,代表整个网络请求是成功的,如果是走了error代表整个网络请求在发送和接收过程中出现问题。

7、在src中创建一个文件夹叫api(api内放置的网络请求,utils中的request.js只是网络请求的方法)。

8、在api文件夹下创建path.js和index.js

9、打开path.js,输入:

const base = { //放置所有的路径
    //公共路径 
    baseUrl:"http://iwenwiki.com",
    chengpin:"/api/blueberrypai/getChengpinDetails.php"
}

//base导出
export default base;

10、打开index.js,输入:

//放置所有网络请求的方法
import axios from "../utils/request"
import path from "./path"

const api = {
    //成品详情地址,当访问这个getChengpin方法,就能拿到这个网络请求的结果了
    getChengpin(){
        return axios.get(path.baseUrl + path.chengpin)
    }
}
export default api;

11、打开HelloWorld.vue,输入:

<template>
</template>

<script>
    import api from "../api/index"
    export default{
        name:'HelloWorld',
        props{
            msg:String
        },
        mounted(){
            api.getChengpin().then(res =>{
                    console.log(res.data);
            })
        }
    }
</script>

### 封装 Axios 实现网络请求的最佳实践 #### 创建 Axios 实例 为了提高代码的可维护性和重用性,创建一个自定义配置的 Axios 实例是一个好的做法。通过这种方式,在项目中的任何地方都可以轻松地使用相同的配置来发送 HTTP 请求。 ```javascript // src/utils/request.js import axios from 'axios'; const service = axios.create({ baseURL: '/api', // 统一设置基础路径[^2] timeout: 5000, // 设置超时时间 }); ``` #### 添加请求拦截器 在实际开发过程中,通常会在请求发出之前做一些处理工作,比如添加认证令牌、显示加载动画等操作。这可以通过配置请求拦截器实现。 ```javascript service.interceptors.request.use( config => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); ``` #### 添加响应拦截器 同样地,对于服务器返回的数据也可以做进一步加工,例如隐藏加载提示框、解析错误信息等逻辑可以放在响应拦截器里完成。 ```javascript service.interceptors.response.use( response => response.data, error => { Message.error(error.message || 'Network Error'); return Promise.reject(error); } ); ``` #### 导出服务实例供外部调用 最后一步就是把构建好的 Axios 实例导出去给其他模块使用,从而达到全局共享的目的。 ```javascript export default service; // 使用示例 import request from '@/utils/request'; request.get('/user').then(res => console.log(res)); ``` 以上便是基于 Axios 的一次较为完整的封装过程[^3],不仅简化了日常编码流程,还增强了应用程序的安全性和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值