阅读webflux文档

This commit is contained in:
asahi
2025-03-12 20:49:15 +08:00
parent 4e9fed19e8
commit be52af362d

View File

@@ -37,6 +37,10 @@
- [Overview](#overview) - [Overview](#overview)
- [Immutable](#immutable) - [Immutable](#immutable)
- [Router Function](#router-function) - [Router Function](#router-function)
- [HandlerFunction](#handlerfunction)
- [Server Request](#server-request)
- [ServerResponse](#serverresponse)
- [Handler Class](#handler-class)
# Spring Webflux # Spring Webflux
@@ -542,4 +546,90 @@ public class PersonHandler {
- `RouterFunctions.toHttpHandler(RouterFunction)` - `RouterFunctions.toHttpHandler(RouterFunction)`
- `RouterFunctions.toHttpHandler(RouterFunction, HandlerStrategies)` - `RouterFunctions.toHttpHandler(RouterFunction, HandlerStrategies)`
### HandlerFunction
`ServerRequest``ServerResponse`为不可变接口两者都对body stream提供Reactive Stream back pressure。
- 其中request body通过Reactor `Flux``Mono`表示
- response body可以通过任何`Reactive Stream Publisher`进行表示,包括`Flux``Mono`
### Server Request
ServerRequest提供了对如下内容的访问
- http method
- uri
- headers
- query params
- body
如下示例展示了如何将请求体转化为`Mono/Flux`类型:
```java
Mono<String> string = request.bodyToMono(String.class);
Flux<Person> people = request.bodyToFlux(Person.class);
```
如下示例展示了如何访问formdata:
```java
Mono<MultiValueMap<String, String>> map = request.formData();
```
如下示例展示了如何访问multipart data
```java
Mono<MultiValueMap<String, Part>> map = request.multipartData();
```
访问multipart数据内容的示例如下所示:
```java
Flux<PartEvent> allPartEvents = request.bodyToFlux(PartEvent.class);
allPartsEvents.windowUntil(PartEvent::isLast)
.concatMap(p -> p.switchOnFirst((signal, partEvents) -> {
if (signal.hasValue()) {
PartEvent event = signal.get();
if (event instanceof FormPartEvent formEvent) {
String value = formEvent.value();
// handle form field
}
else if (event instanceof FilePartEvent fileEvent) {
String filename = fileEvent.filename();
Flux<DataBuffer> contents = partEvents.map(PartEvent::content);
// handle file upload
}
else {
return Mono.error(new RuntimeException("Unexpected event: " + event));
}
}
else {
return partEvents; // either complete or error signal
}
}));
```
### ServerResponse
ServerResponse类提供了对http返回内容的访问由于ServerResponse是不可变的故而可以通过`build`方法来创建ServerResponse。
如下示例展示了ServerResponse的使用
```java
Mono<Person> person = ...
ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(person, Person.class);
URI location = ...
ServerResponse.created(location).build();
```
同时在构建响应体时支持传递hint参数来控制body被序列化和反序列化的方式示例如下
```java
ServerResponse.ok().hint(Jackson2CodecSupport.JSON_VIEW_HINT, MyJacksonView.class).body(...);
```
### Handler Class
可以将HandlerFunction写为lambda的形式示例如下
```java
HandlerFunction<ServerResponse> helloWorld =
request -> ServerResponse.ok().bodyValue("Hello World");
```