java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > @RequestParam和@RequestBody的区别

@RequestParam和@RequestBody的区别是什么?一文看懂

作者:YUELEI118

还在纠结@RequestParam和@RequestBody怎么选?本文用通俗例子讲清两者区别:URL参数用@RequestParam,请求体JSON用@RequestBody,还介绍了@PathVariable的Rest风格用法及属性设置,帮你彻底掌握Spring参数绑定

1. @RequestParam

@RequestParam:在 GET 请求中,如果不需要使用它的特定属性,可以省略;而在其他请求(如 POST、PUT 等)中,若通过 URL 参数(param)方式传送数据,通常也会使用该注释。

不过,并非绝对必须使用,只是使用它能更方便地获取和处理参数。

要点:

  1. 使用@RequestParam还是@RequestBody主要取决于数据发送的方式和格式。如果数据是通过 URL 参数(param,格式为key=value形式,多个参数用&连接)传递,就使用@RequestParam;如果数据是通过请求体(如 JSON、XML 格式,使用data属性在请求中发送数据)传递,那就使用@RequestBody。
  2. GET 请求通常通过 URL 参数发送数据,格式为?username=zhangsan&password=1234&email=zhangsan@powernode.com。POST 请求也可以通过 URL 参数发送数据(此时和 GET 类似)
  3. 如果POST请求的数据是通过POST的请求体发送的,数据格式是username=zhangsan&password=1234这种格式(比如form表单),也需要使用@RequestParam注解的参数接收。

属性

// 发送请求
request.get("/user"{
	params:{	// 必须使用params
		peopleAge: 20,	
	}
})

@GetMapping("/user")
// value属性 :指明发送时url中的名字,和这里的名字做对应,peopleAge对应 age
public String getUser(@RequestParam(value = "peopleAge", defaultValue = "18") int age) {
    return "Your age is " + age;
}
@GetMapping("/user")
public String getUser(@RequestParam(required = false) String email) {
    if (email != null) {
        return "Your email is " + email;
    } else {
        return "No email provided.";
    }
}

2. @RequestBody

@RequestBody: 用于 POST、PUT 这类需要在请求体中携带数据的请求场景,特别是当前端发送 JSON 格式字符串数据时,后端可以用 Java 类来接收这些数据。

用法:

@RequestBody不可以省略

@PostMapping("/user/{id}")
public String updateUser(@RequestBody User user) {
    // 根据id更新用户信息
    return "User updated successfully.";
}
import axios from 'axios';

// 假设后端接口地址
const baseUrl = 'http://localhost:8080';

// 要发送的数据
const userData = {
    // 假设User类有name和age属性,根据实际情况修改
    name: 'John Doe',
    age: 30
};

// 发送POST请求的函数
const sendPostRequest = async () => {
    try {
    //  虽然没有在请求头中指明发送的是json格式,只要使用post请求,就会自动对第二个参数进行json格式化
        const response = await axios.post(`/user`, userData);
        console.log('请求成功', response.data);
    } catch (error) {
        console.error('请求失败', error);
    }
};

// 调用函数发送请求
sendPostRequest();

3. @PathVariable

作用:

  1. Rest风格请求的占位符
  2. 可用于任何请求中,get、post、put等等
  3. 也有required 属性

基本使用

/users/123 //请求的url

@GetMapping("/users/{userId}")
public String getUserById(@PathVariable("userId") Long id) {
    // 根据id从数据库或其他数据源获取用户信息
    return "User with id " + id + " retrieved successfully.";
}
/orders/100/items/200 // 亲求的url,多个

@GetMapping("/orders/{orderId}/items/{itemId}")
public String getOrderItem(@PathVariable("orderId") Long orderId, @PathVariable("itemId") Long itemId) {
    // 根据orderId和itemId获取订单中的商品信息
    return "Retrieving item " + itemId + " from order " + orderId;
}

与正则表达式配合使用

@GetMapping("/users/{userId:\\d+}")
public String getUserById(@PathVariable("userId") String userId) {
    // 这里可以确保userId是数字格式
    return "User with id " + userId + " retrieved successfully.";
}

4. 遇到的其他情况

特别注意属性名,请求中的属性名与Controller中的属性名必须要一致

get请求发送数据,后端可以用类类型接收

  request.get("/admin/list",{
    params:{
      currentPage:1,
      pageSize:10,
      username:"zhangsan",
      name:"张三",
    }
  })
public class AdminController {
  @GetMapping("/list")
  public Result<PageResult> getAdminList(
  	// 参数按照属性名接收
    @RequestParam(defaultValue = "1") Integer currentPage,
    @RequestParam(defaultValue = "10") Integer pageSize,
    // 请求中的参数名和实体类的属性名进行匹配
    Admin admin
  ) {
    PageInfo<Admin> adminList = adminService.getAdminList(currentPage, pageSize);
    return PageResult.ok(adminList);
  }
}

Post请求中@RequestParam和@RequestBody 一起使用

import axios from 'axios';
const baseUrl = 'http://localhost:8080'; 
const sendPostRequest = async () => {
    try {
        const response = await axios.post(`/user`, {
            // 请求体参数
            userInfo: {
                name: 'John Doe',
                age: 30
            }
        }, {
            // 查询参数
            params: {
                id: 123
            }
        });
        console.log('请求成功', response.data);
    } catch (error) {
        console.error('请求失败', error);
    }
};

sendPostRequest();
@PostMapping("/user")
public String saveUser(
        @RequestParam("id") Long id,
        @RequestBody UserInfo userInfo) {
    // 保存用户逻辑
    return "User saved successfully.";
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文