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

news2024/10/5 8:26:01

重生之 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:   封装响应完整的数据
     */

    @Bean
    public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java注解使用与自定义

一、什么是注解 注解是元数据的一种形式&#xff0c;它提供有关程序的数据&#xff0c;该数据不属于程序本身。注解对其注释的代码操作没有直接影响。换句话说&#xff0c;注解携带元数据&#xff0c;并且会引入一些和元数据相关的操作&#xff0c;但不会影响被注解的代码的逻…

程序员自我修养

目录 一、技术能力二、持续学习三、问题解决能力四、代码质量五、团队合作六、责任心七、时间与任务管理八、适应变化九、客户导向十、安全性意识十一、文档撰写十二、伦理与法律意识十三、健康生活 程序员作为现代技术行业的核心成员&#xff0c;不仅需要掌握扎实的技术技能&…

在 Java 项目中扫描识别图片中的文字(详细教程)

目录 需求&#xff1a; 步骤&#xff1a; 1、maven配置&#xff08;pom.xml&#xff09;&#xff1a; 2、下载依赖文件&#xff1a; 3、代码&#xff1a; post进行测试&#xff1a; 测试图片&#xff1a; 测试结果&#xff1a; 需求&#xff1a; 上传图片文件进行扫描…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin&#xff0c;不排序使用…

Windows 2000 Server:安全配置终极指南

"远古技术&#xff0c;仅供娱乐" &#x1f4ad; 前言&#xff1a;Windows 2000 服务器在当时的市场中占据了很大的比例&#xff0c;主要原因包括操作简单和易于管理&#xff0c;但也经常因为安全性问题受到谴责&#xff0c;Windows 2000 的安全性真的那么差吗&#x…

kube-promethesu调整coredns监控

K8s集群版本是二进制部署的1.20.4&#xff0c;kube-prometheus对应选择的版本是kube-prometheus-0.8.0 Coredns是在安装集群的时候部署的&#xff0c;采用的也是该版本的官方文档&#xff0c;kube-prometheus中也有coredns的监控配置信息&#xff0c;但是在prometheus的监控页…

主流 RTOS 实时操作系统介绍

主流 RTOS 实时操作系统介绍 1 介绍1.1 概述1.2 RTOS 应用领域1.3 知名实时系统VRTXpSOSOS-9embOSAzure RTOS 【ThreadX 】OpenWrt 【路由】Mbed OS 【ARM 公司开发】VxWorks 【KUKA、ABB、etc】LynxOSQNXNucleusTHREADXuC/OS –II/III 【Silicon Labs 收购&#xff0c;更新频率…

Qt CAN总线发送和接收案例

文章目录 设置比特率类设置比特率类实现 发送数据帧类发送数据帧类的实现m_ui 发送帧界面 连接类连接类实现连接类UI设计 主窗口类主窗口类实现主界面UI 整体UIQT案例 设置比特率类 // 文件: BitRateBox.h // 作用: 定义了一个用于选择比特率的组合框类 BitRateBox&#xff0c…

冯喜运:6.6周四汇市行情怎么看?黄金原油日内短线布局操作

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;美市盘初&#xff0c;现货黄金震荡走高&#xff0c;目前交投于2342美元/盎司附近。黄金价格周二下跌超过1%&#xff0c;原因是美元在本周晚些时候美国就业数据公布前趋于稳定&#xff0c;该数据可能为美联储的…

敦煌网、ebay、速卖通等平台一直被差评怎么办?

在电商行业里一直都有一句话&#xff0c;有评行走天下&#xff0c;无评寸步难行 而没有review打造爆款的案例是少之甚少&#xff0c;众所周知&#xff0c;review已经成为用户衡量一件商品的标尺&#xff0c;目前我也是看到一个文章上面写到&#xff0c;一个卖家表示自己平时运…

CSRF+XSS组合

环境&#xff1a;dvwa靶场low等级CSRFXSS payload1 将如下代码 1.html 放置攻击者web服务器中&#xff08;dvwa靶场搭建的网站根目录&#xff09; <html> <body onload"javascript:fireForms()"> <script language"JavaScript"> var …

5.透明效果

实时渲染中要实现透明效果&#xff0c;通常会在渲染模型时控制它的透明通道&#xff08;Alpha channel&#xff09;。 当一个物体被渲染到屏幕上时&#xff0c;每个片元除了颜色和深度值之外&#xff0c;它还有另一个属性—透明度。 当透明度为1时&#xff0c;表示该像素是完…

php质量工具系列之phpmd

PHPMD PHP Mess Detector 它是PHP Depend的一个衍生项目&#xff0c;用于测量的原始指标。 PHPMD所做的是&#xff0c;扫描项目中可能出现的问题如&#xff1a; 可能的bug次优码过于复杂的表达式未使用的参数、方法、属性 PHPMD是一个成熟的项目&#xff0c;它提供了一组不同的…

网站安全小白也能搞定的SSL证书安装免费方法

大家都知道&#xff0c;部署一个网站&#xff0c;除了购买域名&#xff0c;现在基本标配SSL证书。 我们以aliyun为例 大家看到这个&#xff0c;收费的SSL证书几千-几万1年不等。这时候&#xff0c;你就会想有没有免费的可以搞。linux老鸟都知道&#xff0c; Let’s Encrypt 、…

痛风患者饮食指南

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f4d2; 饮食指南 &#x1f4d2;&#x1f957; 可食用食品&#x1f966; 蔬菜类&#x1f34e; 水果类&#x1f33e; 全谷物&#x1f95b; 低脂奶制品&#x1f330; 坚果类&#xff08;适量&#xff09;&#x1fad8; 豆制品&am…

RunLoop小白入门

核心概念 什么是 RunLoop ? RunLoop 是 iOS 和 macOS 应用程序框架中的一个核心概念&#xff0c;用于管理线程的事件处理。它可以看作是一个循环&#xff0c;用于持续接收和处理各种事件&#xff0c;如用户输入、定时器、网络事件等。RunLoop 在保持应用程序响应用户交互和系…

docker create rm export exec命令详解

容器生命周期管理命令教程-3 1. 创建容器 docker create&#xff1a;创建一个新的容器但不启动它。 docker create -it --name mycontainer ubuntu bash通常使用 docker run(详细可看上一篇关于run命令的详细介绍) 2. 删除容器 docker rm&#xff1a;删除一个或多个容器。 d…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

如何让 VSCode 认识你正在开发的 NPM 模块

假如你正在开发一个 NPM 模块 echox&#xff0c;并且在 src/index.js 里面导出了一系列方法: // ./src/index.js export function html() {// ... }然后在 tests/index.spec.js 里面新增了以下一行&#xff1a; // ./tests/index.spec.js import * as X from echox;如何让 VS…

【面试干货】SQL中count(*)、count(1)和count(column)的区别与用法

【面试干货】SQL中count&#xff08;*&#xff09;、count&#xff08;1&#xff09;和count&#xff08;column&#xff09;的区别与用法 1、count(*)2、count(1)3、count(column) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在SQL中&a…