Vue + axios 小坑随笔(跨域部分)

本文介绍了在Vue项目中遇到的跨域问题及解决方案,详细解释了如何通过配置Webpack的proxyTable来实现本地开发环境下的跨域请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天闲暇时刻撸项目的时候撸出了一个小坑,虽然很快解决了但是还是想着记录下来,防止以后再掉进去。(说不定明天就又跳进去了2333)

在进入正文之前先小小的偏一下题,聊一下axios —— 首先 axios并不支持 vue.use() 的声明方式使用,一般的声明使用方式应该如下:

main.js

import axios from 'axios';
Vue.prototyps.$axios=axios;

这样子的话在其他的 vue 组件中就可以通过 this.$axios 来调用使用了。

好了,说回正题。这里要说的坑呢就是跨域的问题了。这个问题是在我要调用 api 接口的时候出现的。一开始的时候忽略了这个方面,所以浏览器毫不留情的给了我如下的提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
看到这个错误提示我懵逼了一下,然后恍然大悟 —— 他喵的原来是我忘记设置跨域了…惭愧惭愧。然后花了一点时间配置了一下,然后重启运行,嗯,完美~

咳咳,其实设置跨域也并不复杂,只需要在 webpack 配置一下 proxyTable 就 ok 了。配置文件为 config/index.js,大致代码如下:

加入以下 proxyTable: { 
        '/api': { 
        target: 'http://api.zhuishushenqi.com/',//这个是我调用的api,设置你调用的接口域名和端口号,别忘了加http 
        changeOrigin: true, 
        pathRewrite: { 
        '^/api': '/'//这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用'http://api.zhuishushenqi.com/user/add',直接写‘/api/user/add’即可 
        } 
    } 
},

不过这里只是解决了开发环境中的跨域问题,生产环境中真正部署到服务器上如果是非同源的话还是会存在跨域问题的。但是目前因为还没有做到那一步,所以这个问题暂且不去理会。希望上面啰啰嗦嗦的一堆话能对需要帮助的人起到一定的帮助作用。

Done~

<think>我们参考多个引用中的信息来构建解决方案。用户问题:在Vue3中使用Axios向SpringBoot后端发送包含数组集合的请求。分析:1.引用[1]中展示了SpringBoot后端接收@RequestBody参数的方式,适用于POST/PUT等请求体中的JSON数据。2.引用[2]中提到,前端可以将请求参数统一转换为数组,后端通过数组接收。但注意,引用[2]的后端是Go语言,我们这里是SpringBoot,但原理相似。3.引用[3]指出,如果后端不能正确接收,可能需要设置Content-Type。对于SpringBoot,通常使用application/json。4.引用[4]展示了Vue3项目中配置axios代理和基本设置的方法。因此,我们需要注意:前端(Vue3+axios):-将数组数据作为请求体发送,使用JSON格式。-设置Content-Type为application/json(axios默认就是,但有时需要明确)。-注意:如果使用params选项,则是查询参数(即拼在URL上),而数组在URL中传递比较麻烦,所以这里我们使用请求体。后端(SpringBoot):-使用一个POJO类来接收请求体,其中包含一个数组(或集合)类型的属性。-或者直接使用一个数组(或集合)作为方法参数,但通常更推荐用POJO包装。示例步骤:1.Vue3组件中,使用axios发送POST请求,数据是一个对象,其中包含一个数组属性。2.设置请求头为application/json(默认情况下,axios会自动将JavaScript对象序列化为JSON,并设置Content-Type为application/json)。3.SpringBoot控制器中,使用@RequestBody注解来接收这个对象。代码示例:前端(Vue3+Axios):假设我们要传递一个对象,该对象有一个名为items的数组属性。<scriptsetup>importaxiosfrom'axios';//创建axios实例,可配置baseURL等,这里假设已经配置了代理(如引用[4]的配置)//或者直接使用全局axios,并配置了baseURLconstsendData=()=>{constdata={name:"示例",items:[1,2,3,4]//假设这个数组是要传递的};axios.post('/api/your-endpoint',data).then(response=>{console.log(response.data);}).catch(error=>{console.error(error);});};</script>后端(SpringBootController):定义一个POJO类来接收请求体,例如:publicclassMyRequest{privateStringname;privateList<Integer>items;//getter和setter}在控制器中:@RestController@RequestMapping("/api")publicclassMyController{@PostMapping("/your-endpoint")publicResponseEntity<String>handleRequest(@RequestBodyMyRequestrequest){System.out.println(request.getName());System.out.println(request.getItems());returnResponseEntity.ok("Success");}}注意:-如果数组是顶层元素(即直接是数组,没有包装对象),那么后端可以直接用数组或List接收:@PostMapping("/your-endpoint")publicResponseEntity<String>handleRequest(@RequestBodyList<Integer>items){//...}-但通常建议使用POJO包装,这样扩展性更好。问题:用户提到“数组集合”,我们理解为数组或集合(List)类型。可能遇到的坑:1.问题:引用[4]提供了Vue3项目中的代理配置,用于解决开发环境下的问题。2.如果后端返回415错误,可能是Content-Type不对。确保前端发送的是JSON,后端接收的也是JSON(SpringBoot默认使用MappingJackson2HttpMessageConverter来处理JSON,只要添加了Jackson依赖)。3.SpringBoot项目中需要添加spring-boot-starter-web依赖,它默认包含Jackson。生成相关问题:-1.如果前端传递的是数组,但在后端接收为null怎么办?-2.如何在后端验证接收到的数组数据?-3.如果数组很大,前端如何分批次发送?按照要求,回答中引用的段落末尾添加引用标识。由于我们的回答参考了多个引用,在关键点处标注。注意:引用[1]是关于SpringBoot接收@RequestBody的示例,引用[2]提到了数组传递,引用[4]提供了代理配置。引用[3]虽然关于PHP,但提醒了Content-Type的问题,但我们这里并不需要改为form-data,因为JSON更合适[^1][^2][^3][^4]。</think> 在 Vue3 中使用 Axios 向 Spring Boot 后端发送包含数组集合的请求,需注意前后端配置一致性。以下是完整实现方案: ### 前端 Vue3 + Axios 实现 ```javascript // 安装依赖 npm install axios // 在组件中使用 import axios from 'axios'; // 创建Axios实例(配置代理参考引用[4]) const api = axios.create({ baseURL: '/api', // 代理前缀 headers: { 'Content-Type': 'application/json' // 必须声明JSON格式 } }); // 发送数组集合请求 const sendArrayData = async () => { try { const data = { productIds: [1001, 1002, 1003], // 数组参数 categories: ['电子', '家居'] }; const response = await api.post('/collection', data); console.log('响应:', response.data); } catch (error) { console.error('请求失败:', error); } }; ``` ### 后端 Spring Boot 接收 ```java @RestController @RequestMapping("/api") public class CollectionController { // 使用POJO接收集合参数 @PostMapping("/collection") public ResponseEntity<String> handleArray( @RequestBody CollectionRequest request // 关键注解 ) { System.out.println("产品ID列表: " + request.getProductIds()); System.out.println("分类列表: " + request.getCategories()); return ResponseEntity.ok("接收成功"); } // 封装请求参数的DTO对象 @Data // Lombok注解自动生成getter/setter static class CollectionRequest { private List<Long> productIds; // 数组类型字段 private List<String> categories; // 集合类型字段 } } ``` ### 关键配置说明 1. **Content-Type 一致性** 前端必须设置 `application/json`(Axios默认),后端使用 `@RequestBody` 接收[^1][^3] 2. **参数封装要求** 数组/集合需封装在POJO对象中,Spring Boot不支持直接接收顶级数组[^1] 3. **配置** Vue端需配置代理(如vite.config.ts),解决开发环境问题[^4] 4. **数据类型匹配** Java集合字段名必须与前端JSON键名完全对应(区分大小写) ### 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | 后端收到null | 检查DTO字段命名是否匹配JSON key | | 415 错误 | 确认前端Content-Type=application/json | | 400 错误 | 验证DTO集合泛型类型是否匹配 | | 失败 | 检查Vite代理配置中的`rewrite`规则[^4] | ### 优化建议 1. 为集合添加验证注解: ```java @NotEmpty private List<Long> productIds; ``` 2. 使用Hibernate Validator进行深度校验 3. 前端添加数组空值检查: ```javascript if (data.productIds?.length === 0) { alert('数组不能为空'); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值