java 如果我们返回多个对象,从React性端点返回哪种响应类型更好?

yi0zb3m4  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(136)

如果我们在Spring中使用React式方法,我们可以在方法中返回Flux/Mono类型。因此,在控制器中,最好 Package 响应ResponseEntity并返回它,如果端点返回一个对象,我们可以在React式中编写下一个代码:

@GetMapping(value = "/to-do/{toDoId}", produces = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE})
    public Mono<ResponseEntity<ToDo>> getToDo(@Valid @PathVariable Long toDoId) {
        return repository.findById(toDoId)
                .map(ResponseEntity::ok);
    }

但是如果我们想要返回通量呢?经过一些实验,我找到了这个解决方案:

@GetMapping(value = "/to-do", produces = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE})
    public ResponseEntity<Flux<ToDo>> getToDos() {
        return ResponseEntity.ok().body(
                repository.findAll()
        );
    }

但是如果我这里理解正确的话,这种格式的ResponseEntity<Flux<ToDo>>这样的响应是阻塞的?所以还是做<Flux<ResponseEntity<ToDo>>这样的比较好?如果是这样的话,怎么得到呢?我应该订阅吗?

s5a0g9ez

s5a0g9ez1#

看起来你并没有真正使用ResponseEntity来自定义响应状态,所以,为什么不只是返回单色或通量?

@GetMapping(value = "/to-do/{toDoId}", produces = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE})
    public Mono<ToDo> getToDo(@Valid @PathVariable Long toDoId) {
        return repository.findById(toDoId);
    }

@GetMapping(value = "/to-do", produces = {
            MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE})
    public Flux<ToDo> getToDos() {
        return repository.findAll();
    }

在任何情况下,根据文档,返回ResponseEntity和ResponseEntity都是非常好的,两者都将提供异步的、非阻塞的响应:
ResponseEntity 或ResponseEntity使响应状态和头立即已知,而主体在稍后异步提供。如果主体由0..1个值组成,则使用Mono;如果主体可以生成多个值,则使用Flux。

d7v8vwbk

d7v8vwbk2#

有多种方法可以使用ResponseEntity从无功控制器返回值:

出版商可以是Mono或Flux

  • ResponseEntity<Publisher<T>>-这使得响应状态和头部立即已知,而主体在稍后的某个时间点异步提供。
  • Publisher<ResponseEntity<T>>-这提供了所有三个:响应状态、头和主体,在稍后的某个时间点异步处理。它允许头和响应状态根据异步处理的结果而变化。

也可以使用以下结构,但不太常见:

  • Mono<ResponseEntity<Publisher<T>>>-首先异步提供响应状态和头部,然后异步提供响应主体

相关问题