【问题标题】:Adding custom Response header to Spring WebFlux contoller endpoint将自定义响应标头添加到 Spring WebFlux 控制器端点
【发布时间】:2018-12-17 04:32:35
【问题描述】:

有没有办法向 spring webflux 控制器端点添加响应头?例如对于以下方法,我必须添加一个自定义标题说'x-my-header'

@GetMapping(value = "/search/{text}")
@ResponseStatus(value = HttpStatus.OK)
public Flux<SearchResult> search(@PathVariable(
        value = "text") String text){

        return searchService().find(text);
}

【问题讨论】:

    标签: spring-webflux


    【解决方案1】:

    在函数式 API 中,这真的很简单; ServerResponse builder 拥有几乎所有您需要的构建器。

    使用带注释的控制器;您可以返回 ResponseEntity&lt;Flux&lt;T&gt;&gt; 并设置标题:

    @GetMapping(value = "/search/{text}")
    public ResponseEntity<Flux<SearchResult>> search(@PathVariable(
        value = "text") String text) {
        Flux<SearchResult> results = searchService().find(text);
        return ResponseEntity.ok()
                .header("headername", "headervalue")
                .body(results);
    }
    

    请注意,更新后的代码现在不需要@ResponseStatus 注解。

    更新: 显然上述解决方案有效;除非你有 spring-cloud-starter-netflix-hystrix-dashboard 依赖。在这种情况下,您可以使用以下代码:

    @GetMapping(value = "/search/{text}")
    public Mono<ResponseEntity<List<SearchResult>>> search(@PathVariable(
            value = "text") String text) {
        return searchService().find(text)
                .collectList()
                .map(list -> ResponseEntity.ok()
                        .header("Header-Name", "headervalue")
                        .body(list));
    }
    

    有几点需要注意:

    1. 外部类型应为Mono&lt;ResponseEntity&lt;T&gt;&gt;:请求只有一个响应。如果你声明它是一个Flux,Spring 将尝试反序列化ResponseEntity,就好像它是一个 POJO。

    2. 您需要使用运算符将​​Flux 转换为MonocollectList()single() 将为您完成这项工作。

    使用 Spring Boot 2.0.3.RELEASE 检查

    【讨论】:

    • 非常感谢 MuratOzkan。正是我想要的。顺便说一句,有没有很好的资源来了解 WebFlux/reactive ?
    • 嗯,对于 WebFlux,它更像是官方文档 + 源代码的组合。对于 Project Reactor,请查看projectreactor.io/learn 上的第一个链接,以简要介绍基础知识。很多 RxJava 的东西也适用于 Reactor(+ 你会了解它们的区别)
    • 奇怪的是它对我不起作用..不确定是否与我的环境有关。我试着关注
    • 奇怪的是它对我不起作用..不确定是否与我的环境有关。我尝试了以下 1) return ResponseEntity.ok() .header("headername", "headervalue") .body(results); 2) HttpHeaders 标头 = 新的 HttpHeaders(); headers.add("My-Header-Add", "Added-Header"); headers.set("My-Header-Set", "Set-Header");返回新的 ResponseEntity(response,headers,HttpStatus.OK);但我只得到以下标头 HTTP/1.1 200 Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Mon, 09 Jul 2018 21:07:19
    • 感谢@MuratOzkan 于 7 月 11 日提供的更新答案。它也适用于 Spring Boot M3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2019-02-06
    • 2018-10-04
    • 2019-06-10
    • 2018-02-26
    • 2019-04-03
    相关资源
    最近更新 更多