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

Spring Webflux webclient存在问题,尝试发送post请求时不会发生任何事情

何修能
2023-03-14

具有webclient的以下实现:

    public <T> WebClient.ResponseSpec sendRequest(HttpMethod method, String contentType, T body, String baseUrl, String path) {
    try {
        WebClient webClient = WebClient.builder().baseUrl(baseUrl).filter(logRequest()).build();
        WebClient.ResponseSpec responseSpec = webClient.method(method)
                .uri(path)
                .header(HttpHeaders.CONTENT_TYPE, contentType)
                .body(BodyInserters.fromObject(body))
                .retrieve();
        return responseSpec;
    } catch (Exception e) {
        throw new WebClientProcessingException("Exception when trying to execute request", e);

    }
}

// This method returns filter function which will log request data
private static ExchangeFilterFunction logRequest() {
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
        LOGGER.info("Request: {} {} {}", clientRequest.method(), clientRequest.url(), clientRequest.body());
        clientRequest.headers().forEach((name, values) -> values.forEach(value -> LOGGER.info("{}={}", name, value)));
        return Mono.just(clientRequest);
    });
}

还有下面的代码,创建用户对象和包含用户对象的命令,然后调用webclient发送请求

@Autowired
private BaseWebClient baseWebClient;
@Override
public void saveOrUpdateUser() {
        UserPayload userPayload = new UserPayload();
        userPayload.setUserId(111L);
        userPayload.setCreatedAt(ZonedDateTime.now(DateTimeProps.systemTimeZone));
        UserCommand userCommand = new UserCommand();
        userCommand.setUser(userPayload);
        baseWebClient.sendRequest(HttpMethod.POST, "application/json",
            Stream.of(userCommand).collect(Collectors.toList()),
            "http://localhost:8080",
            "/users").onStatus(HttpStatus::isError, clientResponse -> {
        throw new WebClientUserSaveOrUpdateeFailedException("Exception when trying to update user state")
        .bodyToMono(String.class);
    });
}

用户有效载荷:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserPayload {
  Long userId;
  ZonedDateTime createdAt;
}

用户命令:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserCommand {
     @JsonProperty("user")
     UserPayload user;
}

Json正在等待我的另一个应用程序(我正在向其发送请求):

[
  { "user":
            { 
              "userId": 1,
              "createdAt": "2019-05-16T08:24:46.412Z"
            } 
  }
]

使用:Spring boot 2、Lombok(用于getter/setter)、gradle当我试图发送请求时,什么都不会发生。也不例外。我试过用非常简单的案例来解决同样的问题。还有一点,可以记录尸体吗?我的意思是,不知怎的,我想我错过了一些一般性的东西。

共有1个答案

卫学真
2023-03-14

在Reactor里,在你订阅之前什么都不会发生retrive()实际上不会启动请求。正如您在示例中看到的,您应该使用以下方法之一将ResponseSpec转换为发布服务器,然后最终订阅该发布服务器。

根据您使用此方法的方式,您可能可以让Spring订阅发布服务器。WebFlux支持模型中的反应类型,这意味着您可以直接从RestController方法返回Mono。

 类似资料:
  • 请求方式: "|3|2|url,content|\r" 参数: url 设置Post请求的url链接 content post请求的数据 返回值: "|3|code|data|\r" 参数: code http请求返回的成功或者错误码 成功:code = 200 获取数据失败:code = -1 http请求字段错误:code = 1 data http请求返回的数据 Arduino样例: sof

  • 我在网上找到了这个脚本: 但我不明白如何与PHP一起使用它,也不明白params变量内部的内容是什么,也不明白如何使用它。我能帮个忙吗?

  • 问题内容: 我正在尝试发出POST请求,但无法完成。另一端什么也没收到。 这是应该如何工作的吗?我知道该功能,但我想我不能使用它,因为它不能用测试,对吗? 问题答案: 您基本上有正确的想法,只是发送错误的表格。该表格属于请求的正文。

  • 如果我只在生产者端发送一条记录并等待,生产者何时将记录发送给经纪人?在Kafka文档中,我找到了名为“linger.ms”的配置,它说: 一旦我们得到 根据以上文件,我有两个问题。 > 如果生产者收到的数据达到batch.size,它会立即触发发送一个只包含一个批次的请求给代理?但是正如我们所知,一个请求可以包含许多批次,那么它是如何发生的呢? 这是否意味着即使是收到的数据也不足以批量处理。大小,

  • 问题内容: 我想将我的网址发送到(和)。 我当前的请求代码不起作用。 使用是 不是 一个容易回答。 问题答案: 在iOS中发送和请求非常容易。无需其他框架。 请求: 首先,将我们的(按需发送的内容)创建为,然后将其转换为。 目标 接下来,我们阅读的,因此我们可以将其传递给请求。 现在我们有了要发布的内容,我们可以创建一个,并包含我们的。 迅速 最后,我们可以发送请求,并通过创建新的请求来阅读回复:

  • 我正在尝试加载测试从存档数据库中获取记录的java servlet。 servlet的工作原理如下: 1-从HTTP头读取post变量 2-使用变量查询数据库 3-XML 我已经设置了一个测试,我想用post变量触发HTTP请求,但是测试不起作用,J Meter出现错误。 我已将CSV文件放在保存我的测试计划的同一文件夹中! 这是错误输出: 线程名称:线程组1-1示例开始时间:2012-11-20