【发布时间】:2018-07-29 14:14:44
【问题描述】:
我一直在使用Spring Boot 2.0.0.RC1 并使用spring-boot-starter-webflux 来构建一个返回文本数据流的REST 控制器。
@GetMapping(value = "/")
public Flux<String> getData(){
return Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)...");
}
由于文本数据包含一些变音符号(例如ä、ö、ü),我想将响应的 Content-Type 标头从 text/event-stream 更改为 text/event-stream;charset=UTF-8。因此,我尝试将flux包装成ResponseEntity。像这样:
@GetMapping(value = "/")
public ResponseEntity<Flux<String>> getData(){
return ResponseEntity
.ok()
.contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
.body(Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}
现在,向端点发出 curl 请求表明 Content-Type 保持不变:
< HTTP/1.1 200 OK
< transfer-encoding: chunked
< Content-Type: text/event-stream
<
data:Some text with umlauts (e.g. ├ñ, ├Â, ├╝)...
我怀疑MediaType.parseMediaType() 方法是问题所在,但媒体类型已正确解析(如此屏幕截图所示):
但是,参数charset 似乎被忽略了。 如何将编码更改为 UTF-8,以便浏览器正确解释元音变音字符?
编辑:在GetMapping 注释中设置produces 字段也不起作用。
@GetMapping(value = "/", produces = "text/event-stream;charset=UTF-8")
public ResponseEntity<Flux<String>> getData(){
return ResponseEntity
.accepted()
.contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
.body(Flux.interval(Duration.ofSeconds(2))
.map(l -> "Some text with umlauts (e.g. ä, ö, ü)..."));
}
【问题讨论】:
-
试试这个
@GetMapping(value = "/", produces = "text/event-stream;charset=UTF-8") -
感谢您的评论。我以前试过,但也没有用。
-
Chrome 的行为相同。我认为主要问题是响应的
Conent-Type标头中缺少charset=UTF-8部分。既然没有了,我猜想是 ANSI 编码。 -
问题不在于你的代码,而在于 curl。您需要设置 Accept header 。试试这个
curl -v -H "Accept:text/event-stream;charset=UTF-8" --verbose http://localhost:8080/ -
即使设置了 Accept 标头,结果也是一样的:
> GET / HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.58.0 > Accept:text/event-stream;charset=UTF-8 > < HTTP/1.1 202 Accepted < transfer-encoding: chunked < Content-Type: text/event-stream < data:Some text with umlauts (e.g. ├ñ, ├Â, ├╝)...
标签: spring spring-boot project-reactor spring-webflux reactive-streams