簡體   English   中英

如何使用 Spring5 WebClient 進行異步調用

[英]How to make an asynchronous call using Spring5 WebClient

我是 Spring 反應式框架的新手,並嘗試使用 Spring5 WebClient 進行異步調用。 我能夠成功地進行與同步相同的調用。 但面臨異步調用的問題。

我正在使用以下代碼進行異步調用:

Mono<ClientResponse> reponse = WebClient.builder().build().post()
.uri("http://api.com")
.body(BodyInserters.fromObject("data"))
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer blahblahblahblah")
.exchange();

// couple of logger messages and other statements

問題是它沒有執行 API 調用並且沒有給出響應。 它繼續執行其他語句,但它從不調用 API 調用。

我不想使用block()方法,因為它會將其轉換為同步調用。

我搜索了很多網站和文檔,但相同的代碼用於異步調用。 但不確定為什么它不起作用。 如果我錯過任何事情,誰能幫助我?

您需要訂閱結果。 這可以通過block()調用來完成:

訂閱此 Mono 並無限期阻止,直到收到下一個信號。 如果 Mono 為空,則返回該值或 null。 如果出現 Mono 錯誤,則會引發原始異常(如果是已檢查異常,則將其包裝在 RuntimeException 中)。

如果沒有訂閱,則不會按設計執行調用。 但是,您可以在其他 stream 中傳遞准備好的 mono 以組合它們,但要獲得結果,您必須在某處調用終止操作。

下面的代碼可以工作。

Mono<ClientResponse> reponse =
WebClient.builder().build().post()
.uri("http://api.com")
.body(BodyInserters.fromObject("data"))
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer blahblahblahblah")
.bodyToMono(ClientResponse.class)
.retrieve();

您可以使用 subscribe () function 進行異步調用。 希望它有效..

使用下面的代碼,它解決了你的問題。

String response = WebClient.builder().build()
                    .post()
                    .uri("http://api.com")
                    .header("Authorization", "Bearer yourtoken")
                    .body(Mono.just(body), BodyClassName.class)
                    .retrieve()
                    .bodyToMono(String.class).block();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM