当前位置: 首页 > 知识库问答 >
问题:

您在Web客户端非阻塞调用的方法中返回什么?

毕胡非
2023-03-14

我正在尝试了解如何为我的方法编写 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 成功保存消息,这是所需的行为。

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

对于我目前正在处理的更实际的示例,我调用 WebClient 来获取访问令牌,并在另一个 Web 客户端中使用它来实际保存正文,如下所示: 令牌服务:

    @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();
    }

保存服务:

    @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调用在保存之前应该有自己的流(因为我需要令牌)。但是,调用方法的调用者该怎么办呢?

在了解Web客户端之前,我的第一个方法是在TokenService中进行rest调用,获取令牌,将其传递给SaveService并保存它。现在,TokenService(将不得不更改名称)正在获取令牌并保存它。

我目前的方法还好吗?我应该为来电者返回什么?它应该返回任何东西吗?似乎呼叫者不会知道呼叫是成功还是失败......不确定除了我试图保存它之外,我是否应该记录任何内容?

共有1个答案

索嘉胜
2023-03-14

成功调用“getToken”方法后,它应该返回,告诉用户您已成功获取Token,无需等待“save”方法的执行。

 类似资料:
  • 我有一个微服务,它使用接口从数据库中读取对象。 目标是获取这些对象中的每一个,并将其推送给AWS Lambda函数(在将其转换为DTO之后)。如果lambda函数的结果在200范围内,则将对象标记为成功,否则忽略。 在以前使用简单的Mongo存储库和RestTemplate的时候,这将是一项琐碎的任务。然而,我试图理解这种被动的交易,并避免阻塞。 我读过很多关于这个主题的博客文章,但它们都只是简单

  • 我正在使用Spring Webflux和Spring Boot2,我的场景如下: 在返回之前,我如何将来自流量和正常产品列表的结果连接起来?没有反应控制器是可能的吗? 附言。我不想对从调用1获得的结果调用。block()和CompleteableFuture

  • 问题内容: 我想在Python中运行一个程序,该程序每秒通过Web套接字向Tornado服务器发送一条消息。我一直在websocket-client上使用该示例; 该示例不起作用,因为它将停止while循环的执行。 有人可以给我一个例子,说明如何正确地将其实现为线程类,我既可以调用它的send方法,又可以接收消息? 问题答案: 在他们的github页面上有一个例子可以做到这一点。好像您是从该示例开

  • 我希望客户不会等待4秒然后得到实际的结果。如您所见,服务器在22:44:21.126上开始发出onNext(),客户端在22:44:24.159上获得结果。所以我不明白如果webclient有这种行为,为什么它被称为非阻塞客户端。

  • 本文向大家介绍node.js回调函数之阻塞调用与非阻塞调用,包括了node.js回调函数之阻塞调用与非阻塞调用的使用技巧和注意事项,需要的朋友参考一下 首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?