java - 如何使用 webclient 发布正文 x-www-form-urlencoded?

标签 java spring webclient

    MultiValueMap<String, String> body_data = new LinkedMultiValueMap();
    body_data.add("param1", {param1});
    ...
    WebClient webClient = WebClient.builder().baseUrl(api_url+request_url)
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
            .build();

    String result = webClient.post().contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .bodyValue(BodyInserters.fromFormData(body_data)).retrieve().bodyToMono(String.class).block();

它返回

org.springframework.web.reactive.function.client.WebClientRequestException: Content type 'application/x-www-form-urlencoded' not supported for bodyType=org.springframework.web.reactive.function.BodyInserters$DefaultFormInserter; nested exception is org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/x-www-form-urlencoded' not supported for bodyType=org.springframework.web.reactive.function.BodyInserters$DefaultFormInserter

对此有什么建议吗? 内容类型应该是 application/x-www-form-urlencoded。

最佳答案

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

另一种形式:

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();

关于java - 如何使用 webclient 发布正文 x-www-form-urlencoded?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65103173/

相关文章:

c# - Xamarin IOS WebClient 在线程中执行

java - 具有多个应用程序标签的 AndroidManifest.xml

java - SpringApplication.run() 方法完成之前有很大的延迟

Java Spring Boot - 如何像在 PHP Laravel 中一样为数据库播种

c# - 如何设置 WebClient Content-Type Header?

c# - 用于登录 ASP.NET 网站的控制台应用程序

java - 使用Java的SQL语法错误

java - 没有数组的直方图

java - 如何在 do while 循环中初始化变量而不传递值直到循环关闭?

java - Spring MVC - 接收 XML 对象并反序列化为 Collection