如何在reactor netty服务器中读取请求正文?我想让请求主体确定响应的内容,但在示例代码中找不到这样的示例。
public static void main(String[] args) throws IOException {
Consumer<ByteBuf> onSuccess = (ByteBuf request) -> {
System.out.println("onSuccess: Request received!");
};
Consumer<Throwable> onError = (Throwable ex) -> {
ex.getMessage();
System.out.println(ex.getMessage());
};
Runnable onCompletion = () -> {
System.out.println("Message Completed");
};
CountDownLatch latch = new CountDownLatch(1);
DisposableServer server =
HttpServer.create().handle(new BiFunction<HttpServerRequest, HttpServerResponse, Publisher<Void>>() {
@Override
public Publisher<Void> apply(HttpServerRequest httpServerRequest, HttpServerResponse httpServerResponse) {
Mono<byte[]> mono = httpServerRequest.receive()
.aggregate()
.asByteArray()
.doOnNext(new Consumer<byte[]>() {
@Override
public void accept(byte[] bytes) {
System.out.println(1);
}
})
.doOnError(onError)
.doOnTerminate(onCompletion)
.flatMap(bytes -> {
return Mono.just(bytes);
});
mono.block();
// I want to get http body;
return httpServerResponse.sendString(Mono.just("Hello world"));
}
}).host("localhost")
.port(45441)
.bindNow();
System.in.read();
}
例外
block()/blockFirst()/blockLast()正在阻塞,这在线程reactor-http-nio-2中不受支持
调用者
卷曲http://127.0.0.1:45441/test1/test-d“12312321312”-i-H“内容类型:应用程序/json”-vvv
pom
<dependencies>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-core</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-http</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty-transport-native-kqueue -->
<!-- <dependency>-->
<!-- <groupId>io.netty</groupId>-->
<!-- <artifactId>netty-transport-native-kqueue</artifactId>-->
<!-- <version>4.1.66.Final</version>-->
<!-- <classifier>osx-x86_64</classifier>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.netty</groupId>-->
<!-- <artifactId>netty-all</artifactId>-->
<!-- <version>4.1.66.Final</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/io.netty/netty-transport-native-kqueue -->
<!-- https://mvnrepository.com/artifact/io.netty/netty-transport -->
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-bom</artifactId>
<version>2020.0.10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用Reactor Netty时,您必须执行相反的逻辑:在收到这些字节时发送这些字节。您不应该在事件循环中阻塞。上面的例子可以重写如下:
public static void main(String[] args) throws IOException {
Consumer<Throwable> onError = (Throwable ex) -> {
System.out.println(ex.getMessage());
};
Runnable onCompletion = () -> {
System.out.println("Message Completed");
};
DisposableServer server =
HttpServer.create()
.handle((req, res) ->
res.sendByteArray(req.receive()
.aggregate()
.asByteArray()
.doOnNext(bytes -> System.out.println(1))
.doOnError(onError)
.doOnTerminate(onCompletion)
.flatMap(Mono::just)))
.host("localhost")
.port(45441)
.bindNow();
server.onDispose()
.block();
}
参考文档中有更多示例
问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。
问题内容: 我正在尝试解析方法的某些参数,从请求正文中提取值并进行验证,然后将其注入某些带注释的参数中。 最大的问题是我发现(get from )不能 多次 读取输入流(某些参数在请求正文中)。那么,如何才能多次检索/ 或请求正文? 问题答案: 您可以添加过滤器,拦截当前过滤器并将其包装在custom中。在您的custom中,您将读取请求主体并将其缓存,然后实现并从缓存的值中读取。由于包装请求后,
我试图解析方法的某些特定参数,从请求体中提取值并验证它们,然后将它们注入特定的带注释的参数中。 最大的问题是,我发现(从)读取输入流(某些参数在请求正文中)的次数不能超过一次。那么,如何多次检索/或请求正文?
问题内容: type ValidationModel struct { Name string Email string Password string } 首先,我使用govalidator验证请求正文。 在验证了请求之后,我再次将请求主体解码为用户结构,但已使用validationModel读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有提供任何值。 我在这里可以想到两种解决方案:
问题内容: 我正在用golang编写HTTP处理程序的单元测试。在查看代码覆盖率报告时,我遇到了以下问题:从请求中读取请求正文时,可能会返回我需要处理的错误。但是,当我为我的处理程序编写单元测试时,我不知道如何以触发该错误的方式将请求发送到我的处理程序(内容的结尾过早似乎不会产生这样的错误,但是会在解体身体)。这就是我想要做的: 我该如何为不存在的情况编写测试用例? 问题答案: 您可以创建和使用伪