我从Spring-Boot开始学习Webflux。我了解到,对于RestController的endpoint,您可以定义一个流量请求体,在这里我期望一个真正的流量流,也就是说,整个请求的各个部分一个接一个地出现,这些部分也可以一个接一个地处理。然而,在用客户端和服务器构建了一个小示例后,我无法让它像预期的那样工作。
@PostMapping("/digest")
public Flux<String> digest(@RequestBody Flux<String> text) {
continuousMD5.reset();
return text.log("server.request.").map(piece -> continuousMD5.update(piece)).log("server.response.");
}
@PostConstruct
private void init() {
webClient = webClientBuilder.baseUrl(reactiveServerUrl).build();
}
@PostMapping(value = "/send", consumes = MediaType.TEXT_PLAIN_VALUE)
public Flux<String> send(@RequestBody Flux<String> text) {
return webClient.post()
.uri("/digest")
.accept(MediaType.TEXT_PLAIN)
.body(text.log("client.request."), String.class)
.retrieve().bodyToFlux(String.class).log("client.response.");
}
for i in $(seq 1 100); do echo "The message $i"; done | http POST :8080/send Content-Type:text/plain
2019-05-09 17:02:08.604 INFO 3462 --- [ctor-http-nio-2] client.response.Flux.MonoFlatMapMany.2 : onSubscribe(MonoFlatMapMany.FlatMapManyMain)
2019-05-09 17:02:08.606 INFO 3462 --- [ctor-http-nio-2] client.response.Flux.MonoFlatMapMany.2 : request(1)
2019-05-09 17:02:08.649 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : onSubscribe(FluxSwitchIfEmpty.SwitchIfEmptySubscriber)
2019-05-09 17:02:08.650 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(32)
2019-05-09 17:02:08.674 INFO 3462 --- [ctor-http-nio-2] client.request.Flux.SwitchIfEmpty.1 : onNext(The message 1)
2019-05-09 17:02:08.676 INFO 3462 --- [ctor-http-nio-2] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.676 INFO 3462 --- [ctor-http-nio-2] client.request.Flux.SwitchIfEmpty.1 : onNext(The message 2)
...
2019-05-09 17:02:08.710 INFO 3462 --- [ctor-http-nio-2] client.request.Flux.SwitchIfEmpty.1 : onNext(The message 100)
2019-05-09 17:02:08.710 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.710 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.710 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.711 INFO 3462 --- [ctor-http-nio-2] client.request.Flux.SwitchIfEmpty.1 : onComplete()
2019-05-09 17:02:08.711 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.711 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.860 INFO 3462 --- [ctor-http-nio-6] client.response.Flux.MonoFlatMapMany.2 : onNext(CSubeSX3yIVP2CD6FRlojg==)
2019-05-09 17:02:08.862 INFO 3462 --- [ctor-http-nio-6] client.response.Flux.MonoFlatMapMany.2 : onComplete()
^C2019-05-09 17:02:47.393 INFO 3462 --- [ctor-http-nio-6] client.request.Flux.SwitchIfEmpty.1 : cancel()
但在服务器日志中:
2019-05-09 17:02:08.811 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : onSubscribe(FluxSwitchIfEmpty.SwitchIfEmptySubscriber)
2019-05-09 17:02:08.813 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : onSubscribe(FluxMap.MapSubscriber)
2019-05-09 17:02:08.814 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : request(1)
2019-05-09 17:02:08.814 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : request(1)
2019-05-09 17:02:08.838 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : onNext(The message 1The message 2The message 3The message 4The message 5The message 6The message 7The message 8The message 9The message 10The message 11The message 12The message 13The message 14The message 15The message 16The message 17The message 18The message 19The message 20The message 21The message 22The message 23The message 24The message 25The message 26The message 27The message 28The message 29The message 30The message 31The message 32The message 33The message 34The message 35The message 36The message 37The message 38The message 39The message 40The message 41The message 42The message 43The message 44The message 45The message 46The message 47The message 48The message 49The message 50The message 51The message 52The message 53The message 54The message 55The message 56The message 57The message 58The message 59The message 60The message 61The message 62The message 63The message 64The message 65The message 66The message 67The message 68The message 69The message 70The message 71The message 72The message 73The message 74The message 75The message 76The message 77The message 78The message 79The message 80The message 81The message 82The message 83The message 84The message 85The message 86The message 87The message 88The message 89The message 90The message 91The message 92The message 93The message 94The message 95The message 96The message 97The message 98The message 99The message 100)
2019-05-09 17:02:08.840 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : onNext(CSubeSX3yIVP2CD6FRlojg==)
2019-05-09 17:02:08.852 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : request(32)
2019-05-09 17:02:08.852 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : request(32)
2019-05-09 17:02:08.852 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : onComplete()
2019-05-09 17:02:08.852 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : onComplete()
2019-05-09 17:02:47.394 INFO 3475 --- [ctor-http-nio-2] server.response.Flux.Map.2 : cancel()
2019-05-09 17:02:47.394 INFO 3475 --- [ctor-http-nio-2] server.request.Flux.SwitchIfEmpty.1 : cancel()
我看到所有的文本片断都同时到达服务器,因此作为流量流中的一个大元素进行处理(还可以验证只计算了一个MD5散列而不是100)。
我所期望的是,服务器还将从客户机接收文本片段作为流量流中的元素,否则对于服务器来说,它不是真正的反应,而只是一个普通的阻塞请求。
如果要实现流式效果,可以:
application/stream+JSON
。查看以下SO线程:Spring WebFlux Flux行为与非流应用程序/json这是POST请求的实际图像[使用Android改造上传图像,如何使用改造进行多部分请求][2] 我使用翻新发送了多个图像文件和字符串数据,但在服务器端缺少字符串数据 我的保存注册 API
在Python中,变量根据其内容具有真实值。例如: 我还知道,我可以在根本不使用if运算符的情况下打印比较的真实值: 但是我如何打印变量的/值?目前,我正在这样做: 但这看起来有点不优雅。有没有首选的方式?
好的,所以我做了一些关于常量以及它们应该如何设计和使用的研究。对于我的应用程序来说,有许多枚举可以将彼此相关的术语分组是有意义的。 其想法是,当我开发具有数百个参数(其中许多参数被多次使用)和方法的web服务时,我可以使用枚举的值进行注释。在此之前,有一个巨大、令人厌恶的常量文件,其中包含冗余和未维护的值。 所以,这里有一个枚举我想使用: 这里有一个地方我想用它: 因此,如果我尝试上面的方法,就会
问题内容: 我玩了一段时间,发现了一些有趣的东西: 现在,错误显而易见了,将列表转换为元组就可以像开始时一样正常工作: 现在,我的问题是:为什么第 一个参数必须是str或str前缀的元组,而不是 str前缀 的列表 ? AFAIK,其Python代码可能如下所示: 但这让我更加困惑,因为即使记住了它,列表还是元组也应该没有任何区别。我想念什么? 问题答案: 从技术上讲,没有理由不接受其他序列类型。
我有一个,在中,会抛出 在apphost中: 但是当我调用服务时,http状态码是200,不是401,为什么? HTTP/1.1200OK(为什么不是401?) 缓存控制:专用 内容类型:text/html;字符集=utf-8 服务器:Microsoft IIS/7.5 X-AspNet-Version:4.0。30319 X-Powerd-By: ASP. NET 日期:2014年3月14日星期
我正试图根据API验证自己。这个API使用来自请求的原始主体来创建哈希,它将使用该哈希对我的令牌进行身份验证。 出于测试目的,我使用postman和一个请求前脚本来创建哈希。一切都很好,只有一个例外: 在代码选项卡中,我有 谢了!