在Webclient非阻塞调用的方法中返回什么?



我试图理解我应该如何为我的方法编写WebClient api调用。下面是一个简单的例子:

private String save(String body) {
WebClient client = Webclient.create(saveUrl);
Mono<String> response = client.post()
.accept(MediaType.APPLICATION_FORM_URLENCODED)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(this.getFormInserter(body))
.retrieve()
.bodyToMono(String.class)
responseText.doOnNext(response -> //log successful save message).subscribe();
return ??; // what do I return here?

我知道当我成功完成请求时,它将执行//log successful save message,这是期望的行为。

然而,我所拥有的save方法的常见做法是什么?我习惯将一些字符串值返回给调用者,可能是成功/失败消息,或者在其他情况下,我返回body以便进一步处理。

对于更实际的例子,我目前正在工作,我调用WebClient获取访问令牌,并使用它在另一个WebClient实际保存正文,像这样:TokenService:

@Override
public String getToken(String message) {
WebClient client = WebClient.create(tokenUrl);
Mono<String> responseText = client.post()
.accept(MediaType.APPLICATION_FORM_URLENCODED)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(this.getFormInserter())
.retrieve()
.bodyToMono(String.class)
.retry(3);
responseText.doOnNext(response -> saveService.save(message, getToken(response))).subscribe();
return // what to return?
}
private String getToken(String responseBody) {
JsonObject jsonObject = new Gson().fromJson(responseBody, JsonObject.class);
return jsonObject.get(ACCESS_TOKEN_FIELD).toString();
}

SaveService:

@Override
public Mono<Void> save(String message, String accessToken) {
WebClient client = WebClient.builder()
.baseUrl(saveUrl)
.defaultHeaders(httpHeaders -> {
httpHeaders.setAccept(List.of(MediaType.APPLICATION_JSON));
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setBearerAuth(accessToken);
})
.build();
client.post().body(BodyInserters.fromPublisher(Mono.just(message), String.class));
return null; //do i need to return something?
}

我如何理解WebClient非阻塞调用是,它应该,作为非阻塞建议,不阻塞线程。这意味着,我创建的WebClient调用在保存之前应该有自己的流(因为我需要令牌)。但是,我应该如何处理调用该方法的调用者?

在知道WebClient之前,我的第一个方法是在TokenService中调用rest,获取令牌,将其传递给SaveService并保存它。现在,TokenService(必须更改名称)正在获取令牌并保存它。

我当前的方法可以吗?我该拿什么来招呼客人呢?它应该返回任何东西吗?似乎打电话的人不知道电话是成功还是失败…不确定我是否应该记录任何东西,除了我试图保存它?

getToken"方法被成功调用时,它应该返回并告诉用户您已经成功获取了令牌,并且不需要等待"save"方法。

相关内容

  • 没有找到相关文章

最新更新