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

31

如何使用Spring Boot webclientapplication/x-www-form-urlencoded格式发布请求,示例curl请求中的内容为`application/x-www-form-urlencoded`。

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

我该如何使用WebClient发送相同的请求?

2个回答

71
我们可以使用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();
    

3
这对我不起作用。我得到了以下异常:org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/x-www-form-urlencoded' not supported for bodyType=org.springframework.web.reactive.function.BodyInserters$DefaultFormInserter - Lyannic
12
没关系。我使用了 bodyValue 而不是 body。它可行了! - Lyannic

31
在另一种形式中:
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 更易于使用。


3
这将阻塞调用,使其等待请求完成并返回结果。 - Shehan Simen
应该使用“.body(formData)”而不是“.body(BodyInserters.fromFormData(formData))”。 - Politechniczny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接