当前位置: 首页 > news >正文

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

    • 3.4 函数式 Web

3.4 函数式 Web


个人写过 go 类似于 go + gin 框架

1、场景

场景: User RESTful - CRUD

  1. GET/user/1 获取1号用户
  2. GET/users 获取所有用户
  3. POST/user 清求体携带JSON,新增一个用户
  4. PUT/user/1 请求体携带JSON,修改1号用户
  5. DELETE/user/1删除1号用户

2、核心类

  • RouterFunction: 定义路由信息(发什么请求,谁来处理)
  • RequestPredicate: 定义请求规则:请求谓语、请求方式(GET、POST)、请求参数
  • ServerRequest: 封装请求完整的数据
  • ServerResponse: 封装响应完整的数据

3、实战

  • 新建 Person 类
package com.zhong.web.dto;import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @ClassName : Person* @Description :* @Author : zhx* @Date: 2024-06-02 13:05*/
@JacksonXmlRootElement // 加入注解使其可以输出 xml
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {private Integer id;private String userName;private String like;private Integer age;
}
  • 新建 WebFuntionConfig 建立所有路由与函数的映射
package com.zhong.web.config;import com.zhong.web.biz.UserBizHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.*;/*** @ClassName : WebFuntionConfig* @Description :* @Author : zhx* @Date: 2024-06-02 15:31*/
@Configuration
public class WebFunctionConfig {/*** 函数式 web:* 1、给容器中仿一个 Bean: 类型是 RouterFunction<ServerResponse> 集中所有路由与对应处理函数信息* 2、给每个业务准备应该 Handler** 核心四大对象:*      1、RouterFunction:   定义路由信息(发什么请求,谁来处理)*      2、RequestPredicate: 定义请求规则:请求谓语、请求方式(GET、POST)、请求参数*      3、ServerRequest:    封装请求完整的数据*      4、ServerResponse:   封装响应完整的数据*/@Beanpublic RouterFunction<ServerResponse> userRouter(UserBizHandler userBizHandler) {return RouterFunctions.route()     // 开始定义路由信息.GET("/user/{id}", RequestPredicates.accept(MediaType.ALL), userBizHandler::getUser).GET("/users", userBizHandler::getUserAll).POST("/user", RequestPredicates.accept(MediaType.APPLICATION_JSON), userBizHandler::addUser).PUT("/user/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), userBizHandler::updateUser).DELETE("/user/{id}", userBizHandler::deleteUser).build();}
}
  • 新建 UserBizHandler 处理路由对应的函数处理方法(业务逻辑)
package com.zhong.web.biz;import com.zhong.web.dto.Person;
import jakarta.servlet.ServletException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;import java.io.IOException;
import java.util.Arrays;
import java.util.List;/*** @ClassName : UserBizHandler* @Description :* @Author : zhx* @Date: 2024-06-02 15:40*/
@Slf4j
@Service
public class UserBizHandler {public ServerResponse getUser(ServerRequest request) {String id = request.pathVariable("id");log.info("查询的用户id为 [{}] ", id);// 业务处理Person person = new Person(1, "小钟", "小王", 23);// 构造响应return ServerResponse.ok().body(person);}public ServerResponse getUserAll(ServerRequest serverRequest) {log.info("查询所有用户成功!");List<Person> users = Arrays.asList(new Person(1, "小钟", "小王", 23),new Person(1, "小王", "小钟", 21));return ServerResponse.ok().body(users);}public ServerResponse addUser(ServerRequest serverRequest) throws ServletException, IOException {Object body = serverRequest.body(Person.class);log.info("添加用户成功");return ServerResponse.ok().body(body);}public ServerResponse updateUser(ServerRequest serverRequest) throws ServletException, IOException {Object body = serverRequest.body(Person.class);log.info("更新用户成功");return ServerResponse.ok().body(body);}public ServerResponse deleteUser(ServerRequest serverRequest) {String id = serverRequest.pathVariable("id");log.info("删除用户 【{}】成功!", id);return ServerResponse.ok().body(id);}
}
  • 重新启动项目使用 Postman 测试
  • 根据 id 查询单个用户
http://localhost:8080/user/1

image-20240602160529097

  • 查询所有用户
http://localhost:8080/users

image-20240602160604973

  • 添加用户
http://localhost:8080/user

image-20240602160759439

  • 修改用户
http://localhost:8080/user/1

image-20240602161159139

  • 删除用户
localhost:8080/user/1

image-20240602161257262

  • log 日志

image-20240602161336680

相关文章:

  • 【NOIP提高组】方格取数
  • 如何将静态TCP/IP路由添加到Windows路由表?这里提供方法
  • Java线程中sleep()和wait()有什么区别
  • 基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法
  • 寄存器、缓存、内存(虚拟、物理地址)、DDR、RAM的关系
  • 超大功率光伏并网逆变器学习(三相) 一
  • FPGA实现多路并行dds
  • 第15届蓝桥杯国赛JavaA组个人题解
  • 华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置
  • 【C++题解】1438 - 骑士巡游
  • 线程同步的技术难点
  • vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)
  • 【C#】委托和事件
  • leetcode hot100强化练习 0 - 35
  • 华为S5700交换机版本升级步骤
  • Angularjs之国际化
  • HTML-表单
  • SpiderData 2019年2月23日 DApp数据排行榜
  • spring + angular 实现导出excel
  • spring boot 整合mybatis 无法输出sql的问题
  • vue--为什么data属性必须是一个函数
  • 程序员该如何有效的找工作?
  • 实习面试笔记
  • 学习ES6 变量的解构赋值
  • 智能合约Solidity教程-事件和日志(一)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​一些不规范的GTID使用场景
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • $L^p$ 调和函数恒为零
  • (06)金属布线——为半导体注入生命的连接
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (原)本想说脏话,奈何已放下
  • (转) 深度模型优化性能 调参
  • (转)h264中avc和flv数据的解析
  • (转)Linux下编译安装log4cxx
  • (转)创业的注意事项
  • (转载)虚函数剖析
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Reactor简单使用教程
  • .net连接oracle数据库
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @Query中countQuery的介绍
  • @SpringBootConfiguration重复加载报错
  • [1] 平面(Plane)图形的生成算法
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C/C++]关于C++11中的std::move和std::forward