【问题标题】:How to post request with spring boot web-client for Form data for content type application/x-www-form-urlencoded如何使用 Spring Boot Web 客户端为内容类型 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 发送相同的请求?

【问题讨论】:

    标签: spring-boot spring-webflux spring-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 更容易使用。

    【讨论】:

    • 这样会阻塞调用,所以会等到请求完成后返回
    猜你喜欢
    • 2018-04-04
    • 2021-01-01
    • 2019-07-28
    • 1970-01-01
    • 2016-05-30
    • 2017-06-17
    • 2019-12-24
    • 2015-04-02
    • 2020-04-13
    相关资源
    最近更新 更多