vue-新建项目1

使用vue create新建项目之后,要封装一下axios和请求响应劫持

  • 1 新建config文件夹,然后新建index.js文件,写配置
    config / index.js
export default {
    title: 'demo',
    baseUrl: {
        dev: 'http://localhost:3000', // 开发的时候后台接口的地址
        pro: '' // 上线产品发布之后,后台接口的地址
    }
}
  • 2 然后新建api文件夹,然后在里面新建axios.js封装axios
    api / axios.js
import axios from 'axios';
// 引入配置
import config from '@/config';
// 判断是开发环境还是生产环境
const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro;

class HttpRequest {
    constructor(baseUrl) {
        this.baseUrl = baseUrl,
        // 请求队列,可能会有很多的请求
        this.queue = {}
    }
    // 进行配置,内部的配置
    getInsideConfig() {
        const config = {
            baseURL: this.baseUrl,
            header: {

            }
        }
        return config
    }
    // 拦截请求
    // instance是传入的请求实例对象
    interceptors(instance, url) {
        // instance请求实例拦截
        instance.interceptors.request.use((config) => {
            // 做配置的修改,处理config
            console.log('拦截和处理请求');
            console.log(config,123, url);
            // 可以在这里改配置,比如修改data
            config.data = { msg: 'hello word' }
            // 处理之后要返回配置
            return config
        })
        // 拦截响应
        instance.interceptors.response.use((res) => {
            // 处理响应
            console.log('处理响应');
            // console.log(res);
            // 处理之后返回
            // return res
            // 处理响应,比如直接返回res中的data
            return res.data
        }, (error) => {
            // 请求出问题,处理问题
            console.log(error);
            return { error: '网络出问题了' }
        })
    }
    request(options) {
        const instance = axios.create()     // 创建实例对象
        // options是配置选项,使用assign进行复制,options会覆盖掉内部配置的相同的内容,保留新加的内容
        options = Object.assign(this.getInsideConfig(), options)
        this.interceptors(instance, options.url)
        return instance(options)
    }
}


// 实例化
const axiosObj = new HttpRequest(baseUrl)
export default axiosObj
  • 3 在api文件夹下新建data.js文件,所有的axios请求都放在这个文件夹里面
    在这里插入图片描述
    data.js
// 所有的请求都放在这个data.js文件中

// 引入疯转的axios
import axios from '@/api/axios';

// 配置getBannerData请求
export const getBannerData = () => {
    // 返回axios请求结果
    return axios.request({
        // 传入options配置
        url: '/banner',
        method: 'get'
    })
}

在页面中使用配置的请求

import { getBannerData } from '@/api/data'

export default {
	name: 'Home',
	
	async mounted() {
		let result = await getBannerData()
		// 得到响应结果后打印
		console.log(result);
	}
}
</script>

跨域问题

  • 1 可以在后端解决跨域,使用node演示
const express = require('express')

let app = express();

// 解决跨域
app.use((req, res, next) => {
    res.append('Access-Control-Allow-Origin', '*');
    res.append('Access-Control-Allow-headers', '*');
    next();
})


app.get('/', (req, res) => {
    res.json({ msg: '这是首页' })
})
app.get('/banner', (req, res) => {
    res.json({ msg: '这是banner' })
})

app.listen(3000, () => {
    console.log('http server port at 3000');
})
  • 2 在开发阶段,我们也可以配置跨域请求代理
    1 在项目文件夹下新建vue.config.js文件,配置跨域请求代理
module.exports = {
    devServer: {
        proxy: {
            // 以/api开头的请求代理到target对应的地址
            '/api': {
                target: 'http://localhost:3000',
                // 重写路径
                pathRewrite: {
                    // 匹配到api,替换成''
                    '^/api': ''
                }
            }
        }
    }
}

修改完成之后需要重新npm run serve
然后修改一下config / index.js配置

export default {
    title: 'demo',
    baseUrl: {
        // dev: 'http://localhost:3000', // 开发的时候后台接口的地址
        dev: '/api/', // 跨域请求代理
        pro: '' // 上线产品发布之后,后台接口的地址
    }
}

这样就可以请求3000端口的地址了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值