当前位置:   article > 正文

vue使用axios、多环境配置、代理、常用的请求前后端写法记录。这一篇就够了!_vue2封装axios请求

vue2封装axios请求

目录

前景:

安装axios

封装

简单封装(不推荐)

vue2写法

二次封装(推荐)

vue2示例

vue3示例(语法糖方式)

顺序请求

方式一:async结合await 

方式二:then

常用请求的前后端写法

get请求

路径参数方式,传入的参数是变量

params 路径拼接方式:传入的参数是一个复杂对象

params 路径拼接方式:传入的参数是一个变量

post请求:

参数在请求体中

基于代理配置多环境(解决跨域)

创建环境配置文件

配置代理

修改axios请求配置

启动时选择当前环境


前景:

在做期末作业的时候,老师布置的是做一个前后端分离的项目,我们后端采用spring boot,前端采用vue,前后端通信的是axios请求,记录一下

我看评论区有说跨域的问题,我新增了一段代理内容,一并解决吧

安装axios

输入命令:

npm install axios

封装

新建一个request.js文件,命名随意,注意我这里的提示信息使用了element框架,如果读者没有安装可以删掉相关代码,还有tokenUtil文件,如果读者不需要token直接删掉即可

  1. import axios from 'axios'
  2. import { getToken } from '@/utils/tokenUtil'
  3. import { Message } from 'element-ui'//此处是element-ui如果是plus则是'element-plus'
  4. // 创建axios实例
  5. const request = axios.create({
  6. // 这里可以放一下公用属性等。
  7. baseURL: 'http://localhost:8099', // 用于配置请求接口公用部分,请求时会自动拼接在你定义的url前面。
  8. withCredentials: false, // 跨域请求时是否需要访问凭证
  9. timeout: 3 * 1000, // 请求超时时间
  10. })
  11. // 请求拦截器
  12. request.interceptors.request.use((config) => {
  13. //token名称以自己的为定,我的是‘token’,如果不需要if这里就可以直接删掉
  14. if (getToken('token')) {
  15. config.headers['token'] = getToken('token'); //携带token
  16. }
  17. config.headers['Content-type'] = 'application/json';
  18. return config;
  19. }, (error) => {
  20. return Promise.reject(error)
  21. })
  22. request.interceptors.response.use((response) => {
  23. //返回码以自己的为定,如果没有安装elementui就换成自己的提示
  24. let { code, msg } = response.data
  25. if (code != 200) {
  26. Message({ message: msg || 'error', type: 'warning' })
  27. }
  28. return response.data;//此处可以只返回后端传出的数据(第一层data是axios封装的)
  29. }, (error) => {
  30. return Promise.reject(error)
  31. })
  32. export default request;//记得暴露出去

上面的代码有关于tokenUtil.js相关代码:在utils目录下新建一个tokenUtil.js文件(这里演示就存在localStorage里面,真实情况推荐存在cookie里面)

  1. export function setToken(tokenKey, token) {
  2. return localStorage.setItem(tokenKey, token)
  3. }
  4. export function getToken(tokenKey) {
  5. return localStorage.getItem(tokenKey)
  6. }
  7. export function removeToken(tokenKey) {
  8. return localStorage.removeItem(tokenKey)
  9. }

简单封装(不推荐)

vue2写法

将配置好的request挂载到vue原型上,无需引入,在全局就能使用

在main.js中添加:

  1. import request from '@/utils/request.js'//引入请求配置文件
  2. ....main.js中其他内容
  3. Vue.prototype.$request=request//$不是必要的,只是习惯将原型上的属性用$表示
  4. ....main.js中其他内容

在页面中使用:

  1. methods:{
  2. login(){
  3. this.$request.post("/login",this.loginForm).then(res=>{
  4. ....逻辑处理
  5. }
  6. }
  7. }

缺点:

1、请求路径编写在各个页面中,难以维护,如果后端更改请求路径,修改难度极大

2、无法重用,同一个请求会多次编写

二次封装(推荐)

封装api请求内容:

新建一个api文件夹,里面用于封装api请求,命名随意

我的目录如下

使用:

在需要的页面中import调用即可

vue2示例

 以登录请求为例

封装请求

  1. import request from "@/request";//记得引入进来
  2. export function login(data) {
  3. return request({
  4. method: 'post',
  5. url: '/business/login',
  6. data: data //可以简写为data
  7. })
  8. }

页面中使用

  1. <script>
  2. import { login } from "@/api/index.js";//引入
  3. import {setToken} from "@/utils/tokenUtil"
  4. export default {
  5. methods: {
  6. //调用封装的login请求,将前端用户填写的数据传递
  7. login(this.formlogin).then((res) => {
  8. console.log(res.data);
  9. setToken(res.data.token)//保存后端传来的token
  10. })
  11. }
  12. }
  13. </script>

vue3示例(语法糖方式)

封装的请求

引入

调用

顺序请求

有时候会需要发送一个请求后再发送另一个请求获取数据。虽然获取数据尽量包含在一个请求,但还是难免有这种需要。由于axios(ajax)是异步请求,如果我们顺序调用它并不能保证前面一个请求完成后再调用下一个。所以需要我们进行简单的更改一下

下面演示均是采用vue3写法,如果是vue2则不用function

方式一:async结合await 

  1. async function test(){
  2. let res=await login(数据)
  3. ...// 对res进行处理
  4. let res2=await getLoginUserInfo()
  5. ...//对res2进行处理
  6. //请求三如上
  7. }

方式二:then

  1. 方式1
  2. function test(){
  3. login(数据).then(res=>{
  4. ...// 对res进行处理
  5. getLoginUserInfo().then(res2=>{
  6. ...//对res2进行处理,请求三继续在内部调用
  7. })
  8. })
  9. }
  10. 方式2
  11. function test(){
  12. login(数据).then(res=>{
  13. ...// 对res进行处理
  14. return getLoginUserInfo() //将下一次请求return
  15. }).then(res2=>{
  16. ...//对res2进行处理,
  17. //此处如果再次reture一个请求,
  18. })//则此处又可以.then()了
  19. }

常用请求的前后端写法

get请求

路径参数方式,传入的参数是变量

  1. export function Body(page,size) {
  2. return request({
  3. method: 'get',
  4. url: '/commoditys/'+page+"/"+size
  5. // url:`/commoditys/${page}/${size}`//使用模板字符串语法,注意是``而不是‘’
  6. })
  7. }

后端接收对应的方式

  1. @GetMapping("/commoditys/{page}/{size}")
  2. public AjaxJson QueryCommoditys(@PathVariable("page") int page, @PathVariable("size") int size) {
  3. PageInfo commoditys = commodityService.queryCommoditys(page, size);
  4. return AjaxJson.getSuccessData(commoditys);
  5. }

params 路径拼接方式:传入的参数是一个复杂对象

  1. skuSearchDto :{
  2. categoryId: '',
  3. brandId: '',
  4. state: '',
  5. searchValue: '',
  6. minPrice: 0,
  7. maxPrice: 0,
  8. pageNum: 1,
  9. pageSize: 5,
  10. totals: 0
  11. }
  12. export function getSkuList(skuSearchDto) {
  13. return request({
  14. method: 'get',
  15. url: goodsBase + `get/sku/page`,
  16. params: skuSearchDto
  17. })
  18. }

后端接收方式

 实体接收(注意实体类接收不能使用@RequestParam注解)

  1. @GetMapping("get/sku/page")
  2. public R getSkuList(SkuSearchDto skuSearchDto) {
  3. IPage list = goodsService.getSkuList( skuSearchDto);
  4. return RUtils.successData(list);
  5. }

map接收

  1. @GetMapping("get/sku/page")
  2. public R getSkuList(@RequestParam Map<String,String> skuSearchDto) {
  3. IPage list = goodsService.getSkuList( skuSearchDto);
  4. return RUtils.successData(list);
  5. }

params 路径拼接方式:传入的参数是一个变量

  1. export function getCommodityAttributeInfo(commodityId) {
  2. return request({
  3. method: 'get',
  4. url: '/getCommodityAttribute',
  5. params: {
  6. commodityId
  7. }
  8. })
  9. }

或者可以手动拼接

  1. export function getCommodityAttributeInfo(commodityId) {
  2. return request({
  3. method: 'get',
  4. url: '/getCommodityAttribute?commodityId=' + commodityId,
  5. })
  6. }

 后端接收使用@RequestParam注解即可

  1. @GetMapping("getCommodityAttribute")
  2. R getCommodityAttribute(@RequestParam String commdityId){
  3. //内部逻辑
  4. }

post请求:

参数在请求体中

  1. export function addCommodityAttributeValues(data) {
  2. return request({
  3. method: 'post',
  4. url: '/addCommodityAttributeValue',
  5. data
  6. })
  7. }

后端接收:@RequestBody注解

  1. @PostMapping("addSingleCommodity")
  2. public AjaxJson addSingleCommodity(@RequestBody SingleCommodity singleCommodity){
  3. singleCommodityService.addSingleCommodity(singleCommodity);
  4. return AjaxJson.getSuccess();
  5. }

当然post也可以使用params,包括delete,put请求都一样

例如

  1. export function enroll(data,params={}) {
  2. return request({
  3. method: 'post',
  4. url: '/user/enroll',
  5. data ,
  6. params
  7. })
  8. }

基于代理配置多环境(解决跨域)

一般项目分为开发、测试、生产等多种环境,对应的后端地址可能不同,所以建议采用多环境配置。

vue也提供了对应的配置文件,默认环境:.env;开发环境:.env.development;生产环境:.env.production;测试环境:.env.test;等

注:这些命名都是规定的,如果想要自己自定义,你可以在 vue.config.js 文件中配置 webpack 的 DefinePlugin 来手动加载 .env.xxx 文件中的变量(不推荐)

创建环境配置文件

新建一个.env.development文件,.env.production文件(以这俩环境为例)

  1. # 开发环境
  2. NODE_ENV = 'development'
  3. # 开发环境,默认BASEURL
  4. VUE_APP_BASE_URL = '/api'
  5. # 开发环境,API前缀
  6. VUE_APP_BASE_API = '/api'
  7. #开发环境,Url地址(后端地址)
  8. VUE_APP_BASE_TARGET = 'http://localhost:10001/'

其中配置必须以VUE_APP开头。

配置代理

  1. const {defineConfig} = require('@vue/cli-service')
  2. module.exports = defineConfig({
  3. transpileDependencies: true,
  4. lintOnSave: false,
  5. devServer: {
  6. proxy: {
  7. [process.env.VUE_APP_BASE_API]: {
  8. //请求转发
  9. target: process.env.VUE_APP_BASE_TARGET,
  10. //转发时将前缀"/api"去掉
  11. pathRewrite: {['^' + process.env.VUE_APP_BASE_API]: ""}
  12. }
  13. }
  14. }
  15. })

修改axios请求配置

找到我们之前创建的request.js文件,将发送请求地址更改为前缀

启动时选择当前环境

通过“ --model 环境配置文件”   命令指定运行时采用的环境

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/994138
推荐阅读
相关标签
  

闽ICP备14008679号