java - 使用 Webflux 实现 POST

标签 java spring spring-boot spring-webflux

我有这个 html 表单,当我在网络浏览器中打开它时,它工作正常:

<html>
   <head>
      <meta HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8" />
      <meta HTTP-EQUIV="Cache-Control" CONTENT="no cache" />
      <meta HTTP-EQUIV="Pragma" CONTENT="no cache" />
      <meta HTTP-EQUIV="Expires" CONTENT="0" />
   </head>
   <body OnLoad="AutoSubmitForm();">
      <form name="downloadForm" action="https://c3-test.wirecard.com/acssim/app/bank" method="POST">
         <input type="hidden" name="PaReq" value="eJxtU9tuozAQ......." />
         <input type="hidden" name="TermUrl" value="https://www.test.com" />
         <input type="hidden" name="MD" value="optionalValue" />
         <SCRIPT LANGUAGE="Javascript">
             function AutoSubmitForm() { document.downloadForm.submit();} 
         </SCRIPT>
         <input type="submit" name="continue" value="Continue" />
      </form>
   </body>
</html>

我尝试了这段代码:

WebClient.Builder builder = WebClient.builder();
            WebClient cliensst = builder.build();
            String w = cliensst.post().uri(url)
                            .header("PaReq", pareq)
                            .header("TermUrl", "https://www.test.com")
                            .header("MD", "")
                            .accept(MediaType.TEXT_PLAIN)
                            .contentType(MediaType.TEXT_PLAIN)
                            .retrieve()
                            .bodyToMono(String.class).block();

但我收到错误:org.springframework.web.reactive.function.client.WebClientResponseException$BadRequest:400错误请求

实现这个的正确方法是什么?

最佳答案

你可以试试这个。

public static <T> T executeApiForFormData(String url, Map<String, String> payload, Map<String, String> headers, Class<T> clazz) {
        WebClient client;
        WebClient.Builder builder = WebClient.builder().baseUrl(url);

        MultiValueMap<String, String> formData = new HttpHeaders();
        formData.setAll(payload);

        if (!ObjectUtils.isEmpty(headers)) {
            MultiValueMap<String, String> map = new HttpHeaders();
            map.setAll(headers);
            builder.defaultHeaders((existingHeaders) -> existingHeaders.addAll(map));
        }


        client = builder.build();

        return client
                .method(HttpMethod.POST)
                .body(BodyInserters.fromFormData(formData))
                .retrieve()
                .bodyToMono(clazz)
                .block();
    }

关于java - 使用 Webflux 实现 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053929/

相关文章:

java - 使用java解压文件

java - 放在矩阵上的两个非攻击车的最大平方和是多少?

java - 自定义枚举转换器正在实例化但未调用

spring - @EnableWebFlux 注解的作用是什么

spring-boot - 在 Spring Boot 中运行测试在上下文中失败

java - 仅尝试互联网连接几秒钟

java - 如何在加载 Android 操作系统后自动加载我的应用程序?

spring - 使用 Spring,我可以创建一个可选的路径变量吗?

hibernate - @Transactional Spring Junit 测试不做回滚

java - Spring Boot 集成测试抛出错误 "java.lang.IllegalStateException: Timeout on blocking read for 5000 MILLISECONDS"