如何使用 Spring Boot Web 客户端为内容类型 application/x-www-form-urlencoded 的表单数据发布请求

Posted

技术标签:

【中文标题】如何使用 Spring Boot Web 客户端为内容类型 application/x-www-form-urlencoded 的表单数据发布请求【英文标题】:How to post request with spring boot web-client for Form data for content type application/x-www-form-urlencoded 【发布时间】:2020-05-04 15:05:50 【问题描述】:

如何使用 spring boot webclient 发布内容类型为 application/x-www-form-urlencoded 的请求 内容类型为“application/x-www-form-urlencoded”的示例 curl 请求

--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=XXXX' \
--data-urlencode 'password=XXXX'

如何使用 webclient 发送相同的请求?

【问题讨论】:

【参考方案1】:

我们可以为此使用BodyInserters.fromFormData

webClient client = WebClient.builder()
        .baseUrl("SOME-BASE-URL")
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
        .build();

return client.post()
        .uri("SOME-URI)
        .body(BodyInserters.fromFormData("username", "SOME-USERNAME")
                .with("password", "SONE-PASSWORD"))
                .retrieve()
                .bodyToFlux(SomeClass.class)
                .onErrorMap(e -> new MyException("messahe",e))
        .blockLast();
    

【讨论】:

这对我不起作用。我得到以下异常:org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/x-www-form-urlencoded' not supported for bodyType=org.springframework.web.reactive.function.BodyInserters$DefaultFormInserter 没关系。我使用bodyValue 而不是body。它有效!【参考方案2】:

另一种形式:

MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("username", "XXXX");
formData.add("password", "XXXX");

String response = WebClient.create()
    .post()
    .uri("URL")
    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
    .body(BodyInserters.fromFormData(formData))
    .exchange()
    .block()
    .bodyToMono(String.class)
    .block();

在我看来,对于简单的请求,REST Assured 更容易使用。

【讨论】:

这样会阻塞调用,所以会等到请求完成后返回

以上是关于如何使用 Spring Boot Web 客户端为内容类型 application/x-www-form-urlencoded 的表单数据发布请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Spring Boot/Spring Cloud 实现微服务应用

如何关闭spring boot嵌入式服务器

Spring Boot学习笔记总结

使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端

如何将 Spring-Boot Web 服务转换为 Docker 映像?

Spring Boot 反应式 Web 服务