如何使用 spring boot web-client 为内容类型 application/x-www-form-urlencoded 的表单数据发布请求

Nir*_*ane 12 spring-boot spring-webflux spring-webclient

如何使用 Spring Bootwebclient发布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'
Run Code Online (Sandbox Code Playgroud)

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

Nir*_*ane 27

我们可以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();
    
Run Code Online (Sandbox Code Playgroud)

  • 没关系。我使用了“bodyValue”而不是“body”。有用! (6认同)
  • 那对我不起作用。我收到以下异常: `org.springframework.web.reactive.function.UnsupportedMediaTypeException:bodyType=org.springframework.web.reactive.function.BodyInserters$DefaultFormInserter 不支持内容类型'application/x-www-form-urlencoded' ` (4认同)

cor*_*ump 12

另一种形式:

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();
Run Code Online (Sandbox Code Playgroud)

以我的拙见,对于简单的请求,REST Assured更易于使用。

  • 这将阻塞调用,因此它将等待直到请求完成并返回 (3认同)