SpringBoot WebFlux读取ServerRequest数据

请求与响应说明

在使用SpringBootWebFlux编写Web服务应用程序下,ServerRequest和ServerResponse是不可变接口,提供 JDK 8 友好的 HTTP 请求和响应访问。

WebFlux的请求和响应都提供针对Reactive Streams数据流的背压模式。

  • ServerRequest提供对HTTP方法、URI、标头和查询参数的访问,而对body主体访问则通过特点方法提供。请求主体用 Reactor Flux或Mono表示;
  • ServerResponse提供对HTTP响应的访问,可以使用构建器设置响应状态、添加响应标头或提供正文。响应主体用任何 Reactive Streams 表示Publisher,包括Flux和Mono。

数据与结构示例

前端请求字符串,示例:

{"name": "local","ip": "127.0.0.1"
}

后端SpringBootWebFlux通过ServerRequest对象获取请求body和参数数据流,处理完后通过ServerResponse对象返回响应结果数据流,示例:

/*** 示例:初始化路由对象* @return*/
@Bean
public RouterFunction<ServerResponse> exampleRouterFunction() {return route().GET("/api/example", JSON_ACCEPT, (request)->{return ServerResponse.ok().body(request.bodyToFlux(String.class).doOnNext(item -> System.out.println("receive: " + item)).map(item -> "handle: " + item),String.class);}).build();
}

后端java数据参数映射对象,主要用于序例化与反序例实例对象;

@Data
public class IpVo {private String name;private String ip;
}

获取请求body数据

获取前端body里的字符串

Flux<String> bodyFlux = request.bodyToFlux(String.class);
return ServerResponse.ok().body(bodyFlux.doOnNext(item -> System.out.println("receive: " + item)).map(item -> "handle: " + item),String.class
);

获取前端body中的json数据,用对象接收

return request.bodyToMono(IpVo.class).flatMap(item -> {System.out.println("exec: " + item);Assert.isTrue(isNotEmpty(item.getName()), "The parameter 'name' cannot be empty or null!");Assert.isTrue(isNotEmpty(item.getIp()), "The parameter 'ip' cannot be empty or null!");return this.bodyValue(item);}).onErrorResume(this::errorValue);

获取前端body中的json数据,用map接收

return request.bodyToMono(Map.class).flatMap(item -> {System.out.println("exec: " + item);Assert.isTrue(isNotEmpty(String.valueOf(item.get("name"))), "The parameter 'name' cannot be empty or null!");Assert.isTrue(isNotEmpty(String.valueOf(item.get("ip"))), "The parameter 'ip' cannot be empty or null!");return this.bodyValue(item);}).onErrorResume(this::errorValue);

获取前端body里的字符串流,由于是从exchange交换器中获取原始数据流,则需要对流进行解析与转换成字符串;

return request.exchange().getRequest().getBody().flatMap(dataBuffer -> {String value = null;int count = dataBuffer.readableByteCount();if (count > 0) {byte[] bytes = new byte[count];dataBuffer.read(bytes);DataBufferUtils.release(dataBuffer);value = new String(bytes, StandardCharsets.UTF_8);}System.out.println("receive:" + value);IpVo vo = null;try {vo = objectMapper.readValue(value, IpVo.class);} catch (JsonProcessingException e) {e.printStackTrace();}return this.bodyValue(vo);
}).next().onErrorResume(this::errorValue);

获取请求参数

获取前端请求url中的参数,方法一

return Mono.empty().flatMap(formData -> {String name = request.queryParam("name").orElse(null);Assert.isTrue(isNotEmpty(name) , "The parameter 'name' cannot be empty or null!");String ip = request.queryParam("ip").orElse(null);Assert.isTrue(isNotEmpty(ip) , "The parameter 'ip' cannot be empty or null!");IpVo vo = new IpVo();vo.setName(name);vo.setIp(ip);return this.bodyValue(vo);}).onErrorResume(this::errorValue);

获取前端请求url中的参数,方法二

return Mono.just(new IpVo()).flatMap(vo -> {String name = request.queryParam("name").orElse("");Assert.isTrue(isNotEmpty(name) , "The parameter 'name' cannot be empty or null!");String ip = request.queryParam("ip").orElse("");    Assert.isTrue(isNotEmpty(ip) , "The parameter 'ip' cannot be empty or null!");vo.setName(name);vo.setIp(ip);return this.bodyValue(vo);
}).onErrorResume(this::errorValue);

获取前端请求表单中的参数

//Content-Type: application/x-www-form-urlencoded
return request.formData().flatMap(form -> {String name = form.getFirst("name");Assert.isTrue(isNotEmpty(name), "The parameter 'name' cannot be empty or null!");String ip = form.getFirst("ip");Assert.isTrue(isNotEmpty(ip), "The parameter 'ip' cannot be empty or null!");return bodyValue(ipService.getIps());
}).onErrorResume(this::errorValue);

响应与数据流处理

返回正常响应和失败响应数据

public Mono<ServerResponse> bodyValue(Object body){return ServerResponse.status(HttpStatus.OK).contentType(new MediaType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8))).bodyValue(Optional.ofNullable(body).orElse(""));
}public Mono<ServerResponse> errorValue(Throwable throwable){log.error("Error:", throwable);return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(new MediaType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8))).bodyValue("{\"message\":\"Error: " + throwable.getMessage() + "\"}");
}public boolean isNotEmpty(String param){return param != null && param.trim().length() > 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

[Linux] 信号(singal)详解(一)

标题&#xff1a;[Linux] 信号(singal)详解 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、认识信号 1、认识信号 2、信号特点 3、基本概念 二、信号的产生&#xff08;5种方式&#xff09; 三、信号的保存 正文开始&#xff1a; 一、认识信号 1、认识信…

简单介绍下 VitePress 中的 vp-doc 和 vp-raw

VitePress 是一个轻量级的静态网站生成器&#xff0c;专为快速构建文档网站而设计。它是基于 Vite 和 Vue 3 构建的&#xff0c;旨在提供快速的开发体验和高效的构建过程。 存在两个需要注意的点&#xff1a;vp-doc 和 vp-raw&#xff0c;它们代表了不同的 CSS 样式类和用途&a…

服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列&#xff0c;上层是windows server操作系统ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色&#xff0c;该指示灯对应的硬盘离线&#xff0c;raid不可用。 服务器数据恢复过程…

普及组集训--图论最短路径

定义&#xff1a;表示顶点u到顶点v的一条边的权值&#xff08;边权&#xff09; 最短路径算法有常见的四种&#xff1a;floyd&#xff0c;dijkstra&#xff0c;Bellman-Ford&#xff0c;SPFA 不过Bellman-Ford并不常用&#xff0c;所以本文不提&#xff1b; 重点在于dijkstr…

Linux内核ftrace的使用

文章目录 ftrace使用一、ftrace的功能与用途二、ftrace的实现原理三、ftrace的使用步骤1. 查看tracer&#xff1a;通过查看available\_tracers文件&#xff0c;了解当前内核中可用的插件追踪器2. 选择tracer3. 设置参数和过滤器4.开启追踪5. 读取追踪结果 四、ftrace的常用trac…

【笔记总结】华为云:应用上云后的安全规划及设计

一、背景和问题 数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势&#xff0c;如成本效益、可扩展性、灵活性以及便捷的资源共享等&#xff0c;已然成为了现代业务运营的重要支撑。 今年&#xf…

LeetCode-430. 扁平化多级双向链表-题解

题目链接 430. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目介绍 你将得到一个双链表&#xff0c;节点包含一个“下一个”指针、一个“前一个”指针和一个额外的“子指针”。这个子指针可能指向一个单独的双向链表&#xff0c;并且这些链表也包含类似的特殊…

MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain

介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time&#xff0c;单位:秒&#xff0c;默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启&#xff0c;需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…

【RL Application】语义分割中的强化学习方法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Elasticsearch 入门

Elasticsearch安装 下载软件 Elasticsearch 的官方地址:Elastic — 搜索 AI 公司 | Elastic Elasticsearch 最新的版本是 8.16.1(截止2024.11)&#xff0c;我们选择7.8.0版本。 下载地址&#xff1a;Elasticsearch 7.8.0 | Elastic Elasticsearch 分为Linux和 Windows版本&…

Pyside6-QTableView实战

使用效果 代码 import cv2 import osfrom ui.imageQuery import Ui_DialogImageQuery from utils.log_util import log_message from utils.sys_util import create_dirfrom PySide6.QtWidgets import QApplication, QDialog, QGraphicsPixmapItem, QGraphicsScene from PySid…

Redis开发03:常见的Redis命令

1.输入以下命令&#xff0c;启动redis。 sudo service redis-server start 如果你是直接安装在WSL的&#xff0c;搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏&#xff0c;直接打开Ubentu&#xff0c;输入账密后&#xff0c;输入“sudo service redis-server start”…

JAVA |日常开发中常见问题归纳讲解

JAVA &#xff5c;日常开发中常见问题归纳讲解 前言一、语法错误相关问题1.1 分号缺失或多余1.2 括号不匹配1.3 变量未定义或重复定义 二、数据类型相关问题2.1 数据类型不匹配2.2 整数溢出和浮点数精度问题 三、面向对象编程相关问题3.1 空指针异常&#xff08;NullPointerExc…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0&#xff0c;建议改…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

GEE Landsat 8 可见光影像校正后下载

在遥感影像处理领域&#xff0c;Landsat 8 数据因其 30 米空间分辨率 和 多光谱波段 被广泛应用。处理这些数据时&#xff0c;研究者常常需要对数据进行裁剪、计算指数、图像增强等操作&#xff0c;以满足特定研究需求。 本文将介绍一个 Python 自动化脚本&#xff0c;使用 Goo…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

如何通过 JWT 来解决登录认证问题

1. 问题引入 在登录功能的实现中 传统思路&#xff1a; 登录页面时把用户名和密码提交给服务器服务器验证用户名和密码&#xff0c;并把检验结果返回给后端如果密码正确&#xff0c;则在服务器端创建 session&#xff0c;通过 cookie 把 session id 返回给浏览器 但是正常情…