5-1-vue3框架-调用后端接口,axios使用,解决跨域问题

什么是 axios?

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

一,安装

使用 npm:

$ npm install axios

二、配置axios,添加拦截器

在src目录下新建一个request文件夹,在里面新建index.ts(或者.js)文件,编辑代码如下:

import axios from 'axios'
// 创建一个 axios 实例
const service = axios.create({
	baseURL: '/api', // 所有的请求地址前缀部分
	timeout: 60000, // 请求超时时间毫秒
	withCredentials: true, // 异步请求携带cookie
	headers: {
		// 设置后端需要的传参类型
		'Content-Type': 'application/json',
		'token': 'your token',
		'X-Requested-With': 'XMLHttpRequest',
	},
})

// 添加请求拦截器
service.interceptors.request.use(
	function (config) {
		// 在发送请求之前做些什么
		return config
	},
	function (error) {
		// 对请求错误做些什么
		console.log(error)
		return Promise.reject(error)
	}
)

// 添加响应拦截器
service.interceptors.response.use(
	function (response) {
		console.log(response)
		// 2xx 范围内的状态码都会触发该函数。
		// 对响应数据做点什么
		// dataAxios 是 axios 返回数据中的 data
		const dataAxios = response.data
		// 这个状态码是和后端约定的
		const code = dataAxios.reset
		return dataAxios
	},
	function (error) {
		// 超出 2xx 范围的状态码都会触发该函数。
		// 对响应错误做点什么
		console.log(error)
		return Promise.reject(error)
	}
)
export default service

三,使用axios发送请求

在src目录下新建一个apis文件夹,这里面放入今后所有的请求文件,例如新建一个请求用户信息的接口user.ts,代码如下:

import service from './request.js'

export function fetchList(query) {
 return service({
   url: '/user/list',
   method: 'get',
   params: query
 })
}

export function updateArticle(data) {
 return service({
   url: '/user/update',
   method: 'post',
   data
 })
}

四,在具体业务页面里使用这个请求,

比如是App.vue这个页面

<template>
    <h1>Hello App!</h1>
</template>
<script>
    import {fetchList, updateArticle} from './user'

    export default {
        methods: {
            getUserInfo() {
                const param = {
                    userID: '10001',
                    userName: 'Mike',
                }
                fetchList(param).then((res) => {
                    console.log(res)
                })
            },
            updateUserInfo() {
                const data = {
                    userID: '10001',
                    userName: 'Mike',
                }
                updateArticle(data).then((res) => {
                    console.log(res)
                })
            },
        },
        mounted() {
            // console.log('######')
            this.getUserInfo()
            this.updateUserInfo()
        },
    }
</script>

五,解决跨域问题

跨域问题,不同ip,不同端口,不同域名,都会有跨域问题,

跨域处理,配置vite跨域代理

第一步在:vite.config.js

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server:{
    proxy:{
      '/api':{
        target:'http://127.0.0.1:5000',
        changeOrigin:true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    },
  }

})

第二步,在request.js(具体内容就是上面贴出来的)

使用vite跨域代理之后需要修改刚刚我们配置的axios的域名
使用/api替代域名完成跨域

import axios from 'axios'
// 创建一个 axios 实例
const service = axios.create({
   baseURL: '/api', // 所有的请求地址前缀部分
   timeout: 60000, // 请求超时时间毫秒
   withCredentials: true, // 异步请求携带cookie
   headers: {
   	// 设置后端需要的传参类型
   	'Content-Type': 'application/json',
   	'token': 'your token',
   	'X-Requested-With': 'XMLHttpRequest',
   },
})
....
export default service

后端代码

我使用Python+flask进行了后端的接口模拟

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"


@app.route("/user/list")
def user_list():
    return "<p>/user/list</p>"


@app.route("/user/update", methods=["GET", "POST"])
def user_update():
    return "<p>/user/update</p>"


if __name__ == '__main__':
    app.run()

posted @ 2021-10-28 02:58  技术改变命运Andy  阅读(465)  评论(0编辑  收藏  举报