vue使用axios发送http请求后端springBoot @RequestParam接收不到,解决办法

本文详细记录了一位开发者在使用Vue.js前端框架与SpringBoot后端框架进行跨域HTTP请求时遇到的问题及解决过程。通过调整Content-Type为application/x-www-form-urlencoded并使用URLSearchParams对参数进行封装,成功解决了@RequestParam参数无法被后端接收到的难题。

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

最近在项目中使用vue.js进行前端开发,刚刚接触vue一路磕磕绊绊遇到了很多问题,在这里记录下解决办法。

 这是我们系统中前端的一个axios发送http请求的部分代码片段,向后台发送http请求,后端springBoot始终接收不到

@RequestParam的参数,看下面:

// 封装axios
const http =axios.create({
  timeout: 1000 * 30,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
})

// 发送post请求
this.$http({
    url: 'http://localhost:8080/bindT/1'),
    method: 'post',
    data: {
        ids : ['1','2','3']
    }
}).then(({data}) => {
    if (data && data.code === 0) {
        this.$message({
            message: '操作成功',
            type: 'success',
            duration: 1500
        })
    } else {
        this.$message.error(data.msg)
    }
})
@RequestMapping("/bindT/{type}")
public R bindT(@PathVariable("type") String type, @RequestParam List<String> ids) {
    System.out.println("ids:" + ids.toString());
    return R.ok();
}
2020-07-09 15:15:10.422 ERROR 13316 --- [io-8097-exec-24] c.b.s.c.exception.RRExceptionHandler : 
Required List parameter 'ids' is not present
org.springframework.web.bind.MissingServletRequestParameterException: Required List parameter 'ids' is not present
	at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:204)
	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:112)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)

在网上也找了好多办法都没有解决,如:修改data里面的内容使用dataForm封装、修改headers等等。最终找到一个解决办法:修改headers信息使用

'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'

并且对参数进行

 URLSearchParams()

封装处理。

效果参考下面:

// 封装axios
const http =axios.create({
  timeout: 1000 * 30,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
})

// 对参数进行封装
let searchParams = new URLSearchParams()
searchParams.set('ids', ['1','2','3'])

//发送post请求
this.$http({
    url: 'http://localhost:8080/bindT/1'),
    headers: { //修改头信息,因为只有该处使用,所以不修改全局配置
        'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
    },
    method: 'post',
    data: searchParams
}).then(({data}) => {
    if (data && data.code === 0) {
        this.$message({
            message: '操作成功',
            type: 'success',
            duration: 1500
        })
    } else {
        this.$message.error(data.msg)
    }
})

 后端就可以正常接收了

ids:[1,2,3]
<think>好的,我现在需要帮助用户解决如何将Vue中的两个数组formData和ruleForm分别传递给Spring Boot后端的问题。首先,我得理解用户的需求。他们可能在使用Vue作为前端框架,而Spring Boot作为后端,现在需要传输两个数组数据到后端进行处理。用户可能对如何组织数据结构和后端如何接收不太清楚。 首先,我应该考虑前端Vue部分如何发送这两个数组。通常,前端发送数据到后端可以使用POST请求,数据格式一般是JSON。所以需要将formData和ruleForm组合成一个对象,然后通过axios或其他HTTP发送。这时候要注意数据的结构,比如是否要合并成一个对象还是作为两个独立的参数。 然后,考虑后端Spring Boot如何接收这两个数组。Spring Boot的控制器通常使用@RequestBody来接收JSON数据,或者用@RequestParam接收单个参数。如果前端将两个数组合并成一个对象,后端应该有一个对应的POJO来接收,包含两个数组的字段。例如,创建一个包含formData和ruleForm属性的类,然后使用@RequestBody注解来绑定。 接下来,可能的错误点在哪里?比如,前端发送的JSON结构是否和后端的POJO匹配,字段名称是否一致。另外,如果用户没有正确设置Content-Type为application/json,后端可能无法正确解析数据。这时候需要提醒用户检查HTTP头信息。 另外,用户可能希望分开传递这两个数组,而不是合并成一个对象。这时候可以考虑使用@RequestParam,但需要注意,@RequestParam通常用于查询参数或表单数据,而不是复杂的嵌套结构。对于数组,可以使用相同的参数名多次传递,或者将数组转换为逗号分隔的字符串。不过这种方式可能不够灵活,特别是数组元素复杂时,推荐还是用JSON格式。 还可能遇到的问题是,后端接收到的数组为空。这可能是因为字段名不匹配,或者没有正确使用注解。比如,使用@RequestBody时,必须确保发送的是JSON对象,而如果是表单数据,应该使用@ModelAttribute,但这种情况可能不适合复杂的数组结构。 然后,我需要给出具体的步骤示例。比如,在Vue中如何将两个数组合并,使用axios发送POST请求。然后在Spring Boot中创建对应的实体类,并在控制器中接收。同时,提供两种方式的示例:一种是组合成对象,另一种是作为单独的参数传递。不过单独传递数组可能不太方便,需要处理参数绑定。 可能用户对如何构造请求体不太清楚,所以需要详细说明前端的数据结构,并给出代码示例。同时,提醒用户注意字段名称的一致性,以及后端控制器方法的正确注解。 最后,总结一下关键点:前端组织数据,正确设置请求头和Content-Type,后端使用合适的注解和POJO接收数据,并处理可能的错误情况。这样用户就能根据示例调整自己的代码,解决问题。</think>在Vue和Spring Boot之间传递两个数组的完整实现步骤如下(示例使用axios和JSON格式): --- ### **一、Vue前端处理** ```vue <script> import axios from 'axios'; export default { data() { return { formData: [{ name: 'A' }, { name: 'B' }], // 示例数据 ruleForm: [{ type: '1' }, { type: '2' }] // 示例数据 } }, methods: { async submitForm() { try { // 合并两个数组为对象 const payload = { formList: this.formData, ruleList: this.ruleForm }; const response = await axios.post('/api/submit', payload); console.log('提交成功:', response.data); } catch (error) { console.error('提交失败:', error); } } } } </script> ``` --- ### **二、Spring Boot后端处理** #### 1. 创建接收参数的DTO类 ```java public class FormRequest { private List<FormItem> formList; private List<RuleItem> ruleList; // 必须提供getter/setter // 建议使用Lombok的@Getter @Setter } // 定义嵌套对象(根据实际结构调整) public class FormItem { private String name; // getter/setter } public class RuleItem { private String type; // getter/setter } ``` #### 2. 编写Controller接收方法 ```java @RestController @RequestMapping("/api") public class FormController { @PostMapping("/submit") public ResponseEntity<String> handleSubmit(@RequestBody FormRequest request) { List<FormItem> formData = request.getFormList(); List<RuleItem> ruleForm = request.getRuleList(); // 处理业务逻辑... System.out.println("收到的formData: " + formData); System.out.println("收到的ruleForm: " + ruleForm); return ResponseEntity.ok("处理成功"); } } ``` --- ### **三、关键注意事项** 1. **字段名称一致性**: - 前端payload属性`formList/ruleList`必须与DTO字段名完全一致 - 建议使用Postman测试JSON结构: ```json { "formList": [{"name":"A"}, {"name":"B"}], "ruleList": [{"type":"1"}, {"type":"2"}] } ``` 2. **Content-Type设置**: - 确保axios请求头包含: ```javascript headers: { 'Content-Type': 'application/json' } ``` 3. **复杂嵌套处理**: - 如果数组元素包含多层嵌套对象,DTO类需要完整定义所有层级 - 示例:`List<Map<String, Object>>`(不推荐,建议明确类型) 4. **备选方案-分开发送**: ```javascript // 使用URL参数形式(适合简单数据) axios.post(`/api/submit?formData=${JSON.stringify(formData)}&ruleForm=${JSON.stringify(ruleForm)}`) // Controller使用 @RequestParam("formData") String formDataStr, @RequestParam("ruleForm") String ruleFormStr ``` (需后端进行JSON反序列化,推荐使用RequestBody方式) --- ### **四、常见问题排查** 1. **后端不到数据**: - 检查Chrome开发者工具的Network选项卡,确认请求负载是否符合预期 - 验证DTO类是否有正确的getter/setter - 添加`@Valid @RequestBody`触发参数校验错误提示 2. **类型转换错误**: - 确保前端发送的字段类型与Java类型匹配 - 例如:数字字符串需要对应Java的Integer/Long类型 3. **跨域问题**: - 如果出现CORS错误,需在Spring Boot添加配置: ```java @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("http://localhost:8080"); } }; } ``` --- 通过这种标准的RESTful API交互方式,可以确保复杂数据结构在前后端之间可靠传输。实际项目中建议结合Swagger等工具维护API文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值