关于axios请求java接口中的@RequestParam、@PathVariable及@RequestBody不同接参类型的用法

本文介绍了前端使用axios进行数据传递的三种方式,包括通过params、路径参数和RequestBody,以及后端如何通过@RequestParam、@PathVariable和@RequestBody接收这些参数。同时提到了RESTful规范在GET请求中的应用。

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

一、前端传json对象,后端指定接收json对象中的哪个参数。
(1)前端请求

axios({
    //请求方式
    method:'post',
    //后端接口路径
    url:'http://127.0.0.1:8080/api/deleteUserById',
    //注意这里使用的是params,该属性负责把属性名和属性值添加到url后面,一般和get配合使用,但也能    和post配合使用
    params: {
        id: id
    }
}).then((response) => {
    if(response){
          $.messager.alert("信息提示","删除成功!");
    }else{
          $.messager.alert("信息提示","删除失败!");
    }
}).catch((error) => {
    console.error('请求失败', error);
})

(2)后端接口(接参方式)

   //根据ID删除用户 请使用
    @RequestMapping(value = "/api/deleteUserById")
    @ResponseBody
    public boolean deleteUserById(@RequestParam(value="id",required = true) Integer id) {

        int rowsDeleted = userMapper.deleteUserById((long)id);
        if (rowsDeleted > 0) {
            return true;
        } else {
            return false;
        }
    }

二、axios使用restful规范的get请求,后端使用@PathVariable接参
后端接口路径+属性值;注意!!!路径后面有反斜杠/,注意不要写漏了,不然value就会变成路径的一部分,请求路径就会变成/sys/test后面跟上value的值,从而导致404
(1)前端请求:

//方法名为test,传入数据value
function test(value) {
  axios({
    //请求方式
    method:'get',
    url:'/sys/test/'+value,
  }).then((response) => {
    //response是一个返回的promise对象,该注释所在的这行一般对该promise对象进行处理从而获取数据
  }).catch((error) => {
    //对error进行处理
  })
}

(2)Java后端

//使用restful请求时对应的接收
@GetMapping("/sys/test/{accept}")
public void test(@PathVariable("accept") String(传进来的数据的类型) attributeName){
    //axios使用restful的方式进行传值,而Java就需要用到@PathVariable来接收url后的值,/sys/test/{accept}里的accept必须和@PathVariable("accept")里的accept名字一致,而且一个请求能拥有多个@PathVariable
}

三、@RequestBody接收类型
(1)前端请求

let id = $("#id").val();
let paras = {
    id: id
}
axios.post('http://127.0.0.1:8080/api/deleteUserById',paras).then(function (response){
   if(response){
       $.messager.alert("信息提示","删除成功!");
   }else{
       $.messager.alert("信息提示","删除失败!");
   }
})

(2)Java后端

    @RequestMapping("/api/deleteUserById")
    @ResponseBody
    public boolean deleteUserById(@RequestBody User user) {
        long id=user.getId();
        int rowsDeleted = userMapper.deleteUserById((long)id);
        if (rowsDeleted > 0) {
            return true;
        } else {
            return false;
        }
    }

(3)前端也可以使用ajax请求,但是注意data:JSON.stringify(paras)的写法与axios是不同的。

$.ajax({
				url: 'http://127.0.0.1:8080/api/deleteUserById',
				type: 'POST', // 或者其他请求方法,例如'GET', 'DELETE', 'PUT'等
				contentType: 'application/json', // 指定请求的数据类型为JSON
				data: JSON.stringify(paras), // 将JSON对象转换为JSON字符串并设置为请求体数据
				success: function(response) {
					if(response){
					   $.messager.alert("信息提示","删除成功!");
					}else{
					   $.messager.alert("信息提示","删除失败!");
					}
				},
				error: function(error) {
					console.error('请求失败', error);
				}
			});
<think>好的,用户遇到了前端GET请求中报错“Required request body is missing”的问题,需要帮助解决。首先,我需要理解这个错误的原因。根据HTTP协议,GET请求通常不应该包含请求体,因为规范中没有定义GET请求的body部分。所以,当后端期望在GET请求收到请求体时,就会抛出这个错误。 下来,我需要考虑用户可能的场景。用户可能是在使用类似Spring Boot这样的后端框架,其中某个GET接口的方法数被标记为@RequestBody,导致要求请求体。而前端在发送GET请求时,可能没有正确配置,或者错误地添加了请求体,导致问题。 解决方案方面,首先需要检查后端的接口设计。如果确实需要在请求中传递数据,应该考虑改用POST方法,或者将数放在URL的查询字符串中。例如,将数转换为@RequestParam@PathVariable的形式。如果后端必须使用GET请求体,那么需要确保框架支持,但这种情况并不常见,且可能不符合最佳实践。 对于前端部分,需要检查发送请求的代码,确保GET请求没有包含请求体。例如,在使用Axios时,GET请求的第二个数是配置对象,而不是数据体,容易误用。应该将数放在params字段中,或者拼到URL上。 另外,可能需要与后端开发人员沟通,确认接口的设计是否符合HTTP标准,是否存在误用@RequestBody的情况。如果是,修改后端接口,避免在GET方法中使用请求体。 最后,还要考虑是否有其他可能的错误,比如前端代码中错误地设置了Content-Type头,导致后端误解析。这时候需要移除不必要的头信息,或者确保GET请求不包含这些设置。 总结来说,解决这个问题的关键在于调整接口设计,遵循HTTP规范,前后端协同修改,确保GET请求不使用请求体,而是通过URL数传递数据。</think>### 解决前端GET请求中"Required request body is missing"的方法 #### 问题原因 HTTP协议规定GET请求的语义是获取资源,其数应通过URL传递(如路径数或查询数),而不是通过请求体(request body)。当后端接口使用`@RequestBody`注解定义GET请求时,会导致框架强制要求请求体,但前端未正确发送时就会触发该错误[^1]。 #### 解决方案步骤 1. **后端接口改造** ```java // ❌ 错误写法(GET请求使用@RequestBody) @GetMapping("/data") public ResponseEntity<?> getData(@RequestBody FilterParams params) {...} // ✅ 正确写法1(改用POST方法) @PostMapping("/data") public ResponseEntity<?> fetchData(@RequestBody FilterParams params) {...} // ✅ 正确写法2(使用@RequestParam) @GetMapping("/data") public ResponseEntity<?> getData( @RequestParam String keyword, @RequestParam int pageSize ) {...} ``` 2. **前端请求调整** ```javascript // ❌ 错误写法(GET请求带body) axios.get('/api/data', { data: { keyword: 'test', pageSize: 10 } }) // ✅ 正确写法1(改用POST方法) axios.post('/api/data', { keyword: 'test', pageSize: 10 }) // ✅ 正确写法2(使用查询数) axios.get('/api/data', { params: { // Axios自动转换为URL数 keyword: 'test', pageSize: 10 } }) ``` 3. **特殊情况处理** 若必须使用GET请求体(如复杂查询场景),需要: - 确认后端框架支持(如Spring Boot需显式配置) - 前端设置`Content-Type`头部 ```javascript axios.get('/api/data', { data: { ... }, headers: {'Content-Type': 'application/json'} }) ``` #### 注意事项 - 遵循RESTful规范时,GET请求不应修改服务器状态 - URL长度限制:查询数总长度不宜超过2048字符 - 复杂查询建议改用POST+缓存策略 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值