【问题标题】:How to replace a resttemplate implementation with webclient如何用 webclient 替换 resttemplate 实现
【发布时间】:2020-01-02 12:45:23
【问题描述】:

我正在尝试用 webclient 替换 resttemplate 实现。这里的棘手之处在于,当响应解析时,我需要修改输入对象的属性。我没有找到实现它的方法...

这是其余模板代码:

public Instance login(final Instance instancia, final LoginDTO dto) {
        String url = instancia.getBalancer() + API_AUTHENTICATE_PATH;
        HttpEntity<LoginDTO> request = generateRequest(dto);
        ResponseEntity<JWTToken> token = restTemplate.postForEntity(url, request, JWTToken.class);
        instancia.setToken(token.getBody().getIdToken());
        return instancia;   
}

这就是我现在所拥有的:

    @Override
    public Mono<Instance> login(Instance instancia, LoginDTO dto) {

        Mono<JWTToken> monoToken=webClient.post().uri(url).body((BodyInserters.fromObject(dto))).retrieve()
        .bodyToMono(JWTToken.class);

        return {....};

    }

我被困在那部分,因为我找不到改变 Instance 对象的方法...

还有一点:这是在另一个类中注入的,因为我需要针对多个目标并行运行这个请求。所以,一个块调用是不够的。

有人知道怎么做吗?

提前非常感谢!

【问题讨论】:

  • 如果我理解正确,您可以执行以下操作:JWTToken jWTToken = monoToken.block();
  • 是的,那将是一个不错的选择。不幸的是,我忘了告诉用例是从另一个类并行调用并将其作为客户端注入。所以...我需要并行处理所有调用。事实上,我要编辑这个问题。很抱歉给您带来不便,非常感谢!
  • 你有一个 Mono,并且你想返回一个 Mono。要将 Mono 转换为另一个 Mono,您可以使用 Mono 类的许多方法之一,在 rx 行话中称为运算符。在这种情况下,最常用的一个:map():projectreactor.io/docs/core/release/api/reactor/core/publisher/…

标签: spring webclient resttemplate reactor


【解决方案1】:

很容易实现如下:

@Override
public Mono<Instance> login(Instance instancia, LoginDTO dto) {
    return webClient
            .post()
            .uri(url)
            .body((BodyInserters.fromObject(dto)))
            .retrieve()
            .bodyToMono(JWTToken.class)
            .map(token -> {
                instancia.setToken(token.getBody().getIdToken());
                return instancia;
            });
}

【讨论】:

  • 嗨,斯捷潘!非常感谢你的帮助!我试试看!!