SpringWebFlux中使用与SpringMVC一样的Api接口处理方式

package luck.spring.boot.webflux;

import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.result.view.Rendering;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.Duration;

@RestController
public class LuckRestController {
    @GetMapping("/e")
    public Mono<String> e(@RequestParam(value = "id", defaultValue = "0") Long id) {
        return Mono.just("hello" + 10 / id);
    }

    @GetMapping("/a")
    public Mono<String> a(Long userId) {
        return Mono.just("a:" + userId);
    }

    @GetMapping("/b")
    public Flux<String> b(Long userId) {
        return Flux.just("b:" + userId);
    }

    @GetMapping("/f")
    public Flux<Person> f() {
        return Flux.just(new Person(1, "luck"));
    }

    @GetMapping("/c")
    public String c(Long userId) {
        return "c:" + userId;
    }

    // 启用SSE,规定当前请求服务器要生产的数据类型为event-stream
    // 也就是会在响应头中添加Content-Type:text/event-stream;charset=UTF-8
    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> sse() {
        return Flux.range(1, 100)
                .map(i -> "luck->" + i)
                .delayElements(Duration.ofMillis(600));
    }

    // 返回的是SSE的完整数据
    @GetMapping(value = "/sse1", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> sse1() {
        return Flux.range(1, 100)
                .map(i ->
                        // 构建一个SSE对象
                        ServerSentEvent.<String>builder()
                                .id("id")
                                .data("luck->" + i)
                                .comment("comment")
                                .event("event")
                                // .retry(Duration.ofSeconds(1))
                                .build()
                )
                .delayElements(Duration.ofMillis(600));
    }

    @GetMapping("/baidu")
    public Rendering rendering() {
        return Rendering.redirectTo("http://luck-anti.top/").build();
    }

    // webmvc的sse
    // @GetMapping("/sse/a", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    // public SseEmitter sseEmitter() {
    //     SseEmitter emitter = new SseEmitter();
    //     // 启动一个新的线程生成事件
    //     new Thread(() -> {
    //         try {
    //             for (int i = 0; i < 10; i++) {
    //                 // 发送事件到客户端
    //                 emitter.send(SseEmitter.event().data("Event " + i));
    //                 // 模拟事件之间的延迟
    //                 Thread.sleep(1000);
    //             }
    //             // 发送完成信号
    //             emitter.complete();
    //         } catch (Exception e) {
    //             emitter.completeWithError(e);
    //         }
    //     }).start();
    //     return emitter;
    // }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值