• Spring中常用的请求处理携带参数的注解@RequestBody、@RequestParam和 @PathVariable


    1.在发送请求的时候携带参数的方式:

    1.1Spring框架中支持以下几种方法参数绑定方式:

            1.1.1使用基本类型或包装类作为方法参数

    1. @GetMapping("/users")
    2. public void getUser(int id) {
    3. // 处理接收到的参数(id)
    4. // ...
    5. }

           1.1.2 使用JavaBean作为方法参数

    1. @PostMapping("/users")
    2. public void createUser(User user) {
    3. // 处理接收到的参数(User对象)
    4. // ...
    5. }

            1.1.3使用Spring的简单类型转换器或自定义类型转换器进行类型转换

    1. @GetMapping("/users")
    2. public void getUser(@RequestParam("id") LocalDate date) {
    3. // 处理接收到的参数(日期时间对象)
    4. // ...
    5. }

    方法参数绑定与使用注解和HttpServletRequest对象相比,其主要优势在于能够自动进行参数类型转换,避免了手动解析参数的麻烦。此外,使用方法参数绑定还能够使代码更加简洁和易于阅读。

    1.2.注解的方式接收其他数据格式(json...)的方式

    1. 路径参数(Path Parameters):参数直接嵌入在URL的路径中,用于标识资源的特定实例。例如,/users/{id}中的{id}就是路径参数,用于指定特定用户的ID。

    2. 查询参数(Query Parameters):参数附加在URL的末尾,以键值对的形式出现,并使用?作为分隔符。例如,/search?q=keyword中的q=keyword就是查询参数,用于指定搜索关键字。

    3. 请求体参数(Request Body Parameters):参数包含在HTTP请求的正文中,通常用于POST、PUT等请求方法。参数可以以表单数据、JSON、XML等格式进行传递。

    补充:即使不使用注解,你仍然可以接收到参数。在Java中,可以通过HttpServletRequest对象来获取请求中的参数。

    示例:

    1. @RequestMapping("/users")
    2. public void getUser(HttpServletRequest request) {
    3. String id = request.getParameter("id");
    4. String name = request.getParameter("name");
    5. // 处理接收到的参数(id, name)
    6. // ...
    7. }

    在上述示例中,我们使用`HttpServletRequest`对象的`getParameter()`方法来获取请求中的参数,并进行相应的处理。需要注意的是,使用这种方式来接收参数可能会显得比较繁琐,而且需要手动进行参数解析和类型转换。相比之下,使用注解能够更加简洁和方便地获取参数。因此,在实际开发中,推荐使用注解来接收参数。

     

    2.当在 Spring 框架中进行 Web 开发时,@RequestBody、@RequestParam 和 @PathVariable是常用的注解,用于处理不同类型的请求参数。

    当在 Spring 框架中进行 Web 开发时,@RequestBody@RequestParam@PathVariable 是常用的注解,用于处理不同类型的请求参数。

    在Java的Spring框架中,常用的注解`@RequestBody`、`@RequestParam`和`@PathVariable`分别用于接收不同方式传递的参数。

    1. `@RequestBody`:用于接收请求体参数,通常与POST或PUT请求一起使用。可以将请求体中的JSON、XML等格式的数据绑定到方法的参数上,使得开发者能够轻松地获取请求体中的数据。

    示例:
     

    1. @PostMapping("/users")
    2. public void createUser(@RequestBody User user) {
    3. // 处理接收到的请求体参数(User对象)
    4. // ...
    5. }

    2. `@RequestParam`:用于接收查询参数或表单数据。它可以将URL中的查询参数或表单提交的数据绑定到方法的参数上。

    示例:
     

    1. @GetMapping("/users")
    2. public void getUser(@RequestParam("id") int userId) {
    3. // 处理接收到的查询参数或表单数据(id)
    4. // ...
    5. }

    3. `@PathVariable`:用于接收路径参数。它可以从URL中的路径中提取特定的值,将其绑定到方法的参数上。

    示例:
     

    1. @GetMapping("/users/{id}")
    2. public void getUser(@PathVariable("id") int userId) {
    3. // 处理接收到的路径参数(id)
    4. // ...
    5. }

    使用这些注解,开发者可以根据实际需求,方便地接收不同方式传递的参数。

    2.1@RequestBody 注解:

    @RequestBody 注解通常用于将 HTTP 请求的请求体(request body)绑定到方法参数上。它可以将传递的 JSON、XML 或其他媒体类型的请求体转换为对应的 Java 对象。一般在 POST 或 PUT 请求中使用,用于接收客户端发送的数据。

    示例:

    1. @PostMapping("/create")
    2. public ResponseEntity create(@RequestBody User user) {
    3. // 处理用户创建请求,user为请求体中的JSON对象转换的User对象
    4. // ...
    5. }

    携带请求体的 POST 请求:

    javascript

    1. let user = {
    2. name: 'John',
    3. age: 25
    4. };
    5. axios.post('/users', user)//("你的请求路径",请求携带的参数)
    6. .then(response => {
    7. // 处理返回的数据
    8. })
    9. .catch(error => {
    10. // 处理错误
    11. });

    在这个示例中,我们使用 axios 发送了一个 POST 请求,并将用户对象作为请求的数据直接发送给后端。

    2.2@RequestParam 注解:

    @RequestParam 注解用于从请求的 URL 或查询参数中提取单个请求参数值。它可以指定参数的名称、是否必需、默认值等。一般用于处理 GET 请求的查询参数或 POST 请求的表单参数。

    1. @GetMapping("/user")
    2. public ResponseEntity getUser(@RequestParam("id") Long userId) {
    3. // 根据userId获取用户信息
    4. // ...
    5. }

    2.2.1 我之前在比如微信向程序中发送请求使用的是URL的GET请求方式。

    1. wx.request({
    2. method:"GET",
    3. url: `http://localhost:8080/sfzy_applet_ssm/courseCollection/selectCourse`,
    4. data: {
    5. userId: app.globalData.userInfo.userId
    6. },
    7. success(resp) {
    8. // console.log(resp);
    9. _this.setData({
    10. payedCourseList: resp.data.data.courseList
    11. })
    12. app.delListImgSrc(_this, resp.data.data,"payedCourseList");
    13. }
    14. })

    2.3.@PathVariable 注解:

    @PathVariable 注解用于从请求的路径中提取动态的路径参数。路径参数是 URL 中以占位符形式表示的变量。一般用于 RESTful 风格的接口中,用于传递资源的唯一标识符或其他相关参数。

    1. @GetMapping("/user/{id}")
    2. public ResponseEntity getUserById(@PathVariable("id") Long userId) {
    3. // 根据userId获取用户信息
    4. // ...
    5. }

    如果你使用 Vue.js 来发送请求并携带路径参数或查询参数,以下是一些示例:

    携带路径参数的 GET 请求:

    javascript

    1. let userId = 123;
    2. axios.get(`/users/${userId}`)
    3. .then(response => {
    4. // 处理返回的数据
    5. })
    6. .catch(error => {
    7. // 处理错误
    8. });

    在这个示例中,我们使用 axios 库发送 GET 请求,并通过模板字符串将用户ID作为路径参数拼接到 URL 中。

    为什么有时候需要使用其他注解,而不仅限于 @RequestBody@RequestParam@PathVariable 呢?这是因为不同的注解提供了更灵活的参数处理方式,适应不同的请求场景和需求。比如:

    • @RequestHeader:用于获取 HTTP 请求头中的值。
    • @CookieValue:用于获取 HTTP 请求中的 Cookie 值。
    • @ModelAttribute:用于将请求参数绑定到模型对象。
    • 等等。

    根据具体的业务需求和请求参数类型,选择合适的注解来处理请求参数,以便更方便地获取和处理请求数据。

    3.例如以下这个方式

    携带查询参数的 GET 请求:

    javascript

    1. let page = 1;
    2. let size = 10;
    3. axios.get('/users', {
    4. params: {
    5. page: page,
    6. size: size
    7. }
    8. })
    9. .then(response => {
    10. // 处理返回的数据
    11. })
    12. .catch(error => {
    13. // 处理错误
    14. });

    在这个示例中,我们通过在 params 对象中设置查询参数来传递 pagesize 参数的值。

    4.1URL 查询参数(Query Parameters):将查询参数直接附加在 URL 后面,使用?&进行连接。例如:/users?page=2&size=10

      1. @GetMapping("/users")
      2. public ResponseEntity> getUsers(@RequestParam("page") int page, @RequestParam("size") int size) {
      3. // 处理逻辑
      4. }

      在这种情况下,可以使用@RequestParam注解来获取查询参数。

    4.2请求体中的 JSON 参数:将查询参数封装在请求体中作为 JSON 数据发送。

    例如:

    • json

    1. {
    2. "page": 2,
    3. "size": 10
    4. }

    java

    1. @PostMapping("/users")
    2. public ResponseEntity> getUsers(@RequestBody UserRequest request) {
    3. int page = request.getPage();
    4. int size = request.getSize();
    5. // 处理逻辑
    6. }

    在这种情况下,可以使用@RequestBody注解来将请求体的 JSON 数据映射到自定义的请求对象(UserRequest)中,然后从该请求对象中获取查询参数。

    上述我所提供的一些示例可以参考,在 Vue.js 中使用 axios 库发送请求时,如何携带路径参数、查询参数以及请求体。你可以根据具体需求,结合 Vue.js 的语法和功能,对 URL 进行拼接和参数传递。

  • 相关阅读:
    Rasa NLU中的组件
    PHP下载文件
    如何从手动测试转到自动化测试?(附有自动化测试学习路线)
    二、python Django路由与请求(request的参数)
    TiDB Lightning 简介
    IMX6ULL + SPI LCD(驱动IC ILI9341)显示简单的QT界面
    【JAVA】为什么要使用封装以及如何封装
    JavaWeb以Maven整合Mybatis报错java.lang.NoClassDefFoundError(Web项目未能完全加载Maven下的依赖)
    MyBatis篇---第五篇
    .bat批处理命令处理文件
  • 原文地址:https://blog.csdn.net/qq_59335499/article/details/132773342