使用 WEBCLIENT 使用 POST 请求客户端方法

to consume POST request client method using WEBCLIENT

我是 WebClient 领域的新手,但我 运行 遇到了以下问题。这是我的客户端方法,你看到应该把我发给参数的值插入到数据库中,但是我不能插入。

 @Override
    public Mono<BulkSmsRequestResource> sendSms(BulkSmsRequestResource request) {
        Mono<BulkSmsRequestResource> bulkSmsRequestResourceMono = webClientBuilder.build()
                .post()
                .uri(url1)
                .body(Mono.just(request), BulkSmsRequestResource.class)
                .retrieve()
                .bodyToMono(BulkSmsRequestResource.class);
        return bulkSmsRequestResourceMono;

    }

我这里写的代码是我的controller区

@PostMapping("/send")
public ResponseEntity<? extends ResponseResource> sendSms(@RequestBody BulkSmsRequestResource request) {
    if (request == null) {
        return new ResponseEntity<>(
                new ErrorResponseResource(
                        "Transaction failed successfully!",
                        400),
                HttpStatus.BAD_REQUEST);
    }
    this.smsSendService.sendSms(request);
    return new ResponseEntity<>(new SuccessResponseResource("Transaction done successfully", 200), HttpStatus.OK);

}

当我 运行 我的方法时,我无法将值添加到服务器端的数据库,但我可以使用客户端方法使用以下方法从那里获取值。

@Override
public Flux<BulkSmsResponseDto> findAll() {
    Flux<BulkSmsResponseDto> bulkSmsResponseDtoFlux = webClientBuilder.build()
            .get()
            .uri(url2)
            .retrieve()
            .bodyToFlux(BulkSmsResponseDto.class);
    return bulkSmsResponseDtoFlux;
}

为了触发 WebClient 响应式请求,您必须订阅 lattery 以触发 HTTP 调用:

service.sendSms(request)
    .subscribe(System.out::println);

否则,您必须将 Mono<?> 链接到控制器方法结果,以便底层基础设施(在本例中为 Spring)知道如何处理它(在更改点订阅它导致调用 HTTP 调用)。

因此,为了在您的控制器端点调用时触发 WebClient 请求,您必须将其 return 结果映射到正确的 ResponseEntity 然后 return结果 Mono:

@PostMapping("/send")
public Mono<ResponseEntity<? extends ResponseResource>> sendSms(@RequestBody BulkSmsRequestResource request) {
    if (request == null) {
        return Mono.just(new ResponseEntity<>(
                new ErrorResponseResource(
                        "Transaction failed successfully!",
                        400),
                HttpStatus.BAD_REQUEST));
    }
    return this.smsSendService.sendSms(request)
        .map(result -> new ResponseEntity<>(new SuccessResponseResource("Transaction done successfully", 200), HttpStatus.OK));
}

设计附注:也许您需要使用正确的 HTTP 代码 (201) 以及对已创建资源的引用来更新响应。