首页 > 其他分享 >Vue 中 axios 的使用和跨域问题的解决

Vue 中 axios 的使用和跨域问题的解决

时间:2023-10-25 16:13:03浏览次数:31  
标签:axios http 跨域 request Vue js api 请求

一、内容:
1.Axios是一个基于 promise 的 HTTP库,类似于 jQuery 的 ajax,用于http请求。axios 并不是 vue 插件,所以不能使用 Vue.use()。
2.它既可以应用于浏览器端,也可以应用于node.js编写的服务端。
3.Axios具有以下特性:
  (1)支持Promise API。
  (2)拦截请求与响应,比如:在请求前添加授权和响应前做一些事情。
  (3)转换请求数据和响应数据,比如:进行请求加密或者响应数据加密。
  (4)取消请求。
  (5)自动转换JSON数据。
  (6)客户端支持防御XSRF(跨站点请求伪造)。
4.Promise API 是一种异步编程的解决方案,可以帮助管理异步操作,使得代码更易于理解和维护。
5.Promise 的基本流程包括以下几个步骤:
  (1)创建一个新的 Promise 对象,并传入一个执行器函数作为参数。执行器函数接受两个参数:resolve 和 reject,分别用于在异步操作成功或失败时改变 Promise 的状态。
  (2)在执行器函数中执行异步操作,如果操作成功,则调用 resolve 函数,将 Promise 状态变为已解决,并将操作结果作为参数传递出去;如果操作失败,则调用 reject 函数,将 Promise 状态变为已拒绝,并将错误信息作为参数传递出去。
  (3)通过调用 Promise 对象的 then 方法或 catch 方法来处理异步操作的结果。then 方法用于处理操作成功的情况,catch 方法用于处理操作失败的情况。

二、安装:
执行命令:cd xxxx(项目目录)
执行命令:npm install axios

三、创建 network
在 src 目录下创建目录 network,在目录 network 下创建三个文件 http.js、api.js、request.js:

(1)request.js,引入 axios,创建 axios 实例 request,配置并暴露 request:

import axios from "axios";
const request = axios.create({   baseURL: '/api',   timeout: 2000 });
request.interceptors.request.use(config=>{   return config; });
request.interceptors.response.use(response=>{   return response; }, error=>{   return error; });
export default request;

(2)http.js,引入 request 之后,创建 http 对象,封装对 request 的调用:

import request from "./request";
const http ={   get(url, params, headers){     const config ={     method: 'GET',     url:url,     params: params ? params : {},     headers: headers ? headers : {}   };   return request(config); },
post(url, params, headers){   const config ={     method: 'POST',     url:url,     params: params ? params : {},     headers: headers ? headers : {}   };   return request(config); } };
export default http;

(3)api.js 用来统一管理接口 url,

import http from "./http";
const urls={   department:'api/Department' };
export default {   getDepartments(){     return http.get(urls.department);   } }

  

四、使用
(1)在组件中调用:

<script>
import api from '../network/api';

export default {
  data(){
    return {
      formLabelWidth: '100px',
    }
  },
  mounted(){
    api.getDepartments()
    .then(res=>{
        if(res.status === 200){
        if(res.data){
          this.loading(1, res.data);
        }
      }
    })
    .catch(error=>{
      console.log('AddUser.vue getDepartments:', error);
    });
  }
}
</script>

  

(2)解决开发时跨域问题
修改 vue.config.js 文件,添加如下配置:

//...
module.exports = defineConfig({
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8088',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
})

其中,target 用于配置服务器地址;pathRewrite 的配置是将请求中的/api 重写为空字符。

请求路径的组装过程如下:
A. api.js 中的 url(api/Department),与 request.js 中的 baseURL (/api)组合,生成:/api/api/Department
B. 请求路径“/api/api/Department”是以 “/api”开头,被代码服务 devServer 捕获,
C. 代理服务器重写请求路径“/api/api/Department” 为 “/api/Department” (将请求中的 /api 重写为空字符)
D. 代理服务器将请求路径与 target 结合,生成最终的请求路径:“http://localhost:8088/api/Department”
E. 代理服务器访问地址:“http://localhost:8088/api/Department”,拿到返回结果之后,将数据返回给 then 方法中的回调函数。

注意:request.js 中的 baseURL 不要配置以 http:// 开头的路径,需配置为 devServer.proxy 中的路径,否则代理服务器无法匹配到请求路径,将仍然报跨域错误。

标签:axios,http,跨域,request,Vue,js,api,请求
From: https://www.cnblogs.com/jmllc/p/17787424.html

相关文章

  • Vue中 使用 Scss 实现配置、切换主题
    1.样式文件目录介绍本项目中的公共样式文件均位于src/assets/css目录下,其中index.scss是总的样式文件的汇总入口,common.scss是供全局使用的一些基本样式(常量),_theme.scss、_handle.scss两个文件是进行主题颜色配置的文件。如下图,将index.scss在main.js文件中引入即可全......
  • vue实现动态展开与折叠内联块元素
    功能需求当多个内联块元素(比如div)在一个固定宽度的父元素内自动排列换行时,如果这些元素的行数超过四行,那么默认折叠超出的部分,并在第四行末尾显示一个按钮供用户切换展开或折叠状态。在折叠状态下,为了确保展开/折叠按钮能够显示在第四行末尾,会隐藏第四行的最后一个元素。在展开状......
  • 29-Vue脚手架-mixin 混入
    mixin混入功能:可以把多个组件共用的配置提取成一个混入对象使用混合:1)第一步,定义混入新建一个JS文件,比如mixin.jssrc/mixin.js//分别暴露exportconsthunhe1={methods:{showName(){alert(this.name)}},mounted(){......
  • vue3 watch 用法
    <scriptsetup>import{ref,computed,watch}from'vue'constnum=ref(1)constname=ref('ming')constobj=ref({name:'小明',age:30})//watch简单类型//watch(num,(newValue,oldVal......
  • [Vue]computed和watch的区别
    computed和watch之间的区别: 1.computed能完成的功能,watch都可以完成。 2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。两个重要的小原则: 1.所有被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。 2.所有不......
  • springboot解决跨域
    新建config包在建文件复制进去即可importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigura......
  • vue中如何使用svg,以及碰到的相应问题
    安装cnpminstallsvg-sprite-loader--save-dev创建svg文件夹存放svg图标创建icons文件夹,在icons文件夹下创建svg文件夹存放本地svg图标。vue.config.js中配置svg图片config.module.rule("svg").exclude.add(resolve("src/icons")).end();config.module.rule......
  • vue3 elementplus table表格内添加checkbox和行号
    1.仅添加复选框<el-table-columntype="selection"width="55"></el-table-column>2.添加复选框和文字行号在一列<el-table-column><template#header><el-checkboxv-model="selectAll"@change="han......
  • vue 首次加载项目,控制台报错: Redirected when going from "/" to "/login"
    第一次加载加载页面时报错如下:Redirectedwhengoingfrom"/"to"/login"viaanavigationguard. ![image](https://img2023.cnblogs.com/blog/1880163/202310/1880163-20231025113840444-1010075971.png)后续在地址栏直接添加/login,index,错误页面等均正常无报错.路由......
  • Jenkins配置java和vue构建环境
    jdk,maven,node,localtime等配置可通过挂载的方式进行配置前提条件是虚拟机中已配置好jdk,maven,node等环境注意自己虚拟机相关环境配置的路径以下样例为我自己的虚拟机中的配置路径-v宿主机(虚拟机)路径:容器路径dockerrun--namejenkins-p28081:8080-p50000:50000-v/v......