Spring WebClient POST 和 application/x-www-form-urlencoded 的内容长度 Header

Spring WebClient POST and Content Length Header for application/x-www-form-urlencoded

我正在使用 Spring WebClient 和 Spring Boot 2.3。5.RELEASE 向 POST 请求内容类型为 application/x-www-form-urlencoded 的网站.它一直失败,因为未设置 Content-Length header。我可以在代码中设置它,但我不确定当 Content-Type 为 application/x-www-form-urlencoded 时如何计算 Content-Length。我正在访问的 URL 是一个遗留站点。我看到了 post 但它没有解决 Content-Type=application/x-www-form-urlencoded.

的问题

我在 Postman 中执行了相同的请求,它工作正常。在 Postman 中,如果我删除 Content-Length header,我会得到与代码中相同的错误。

请告知如何计算 Content-Length。谢谢。

这是一个片段。

final MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
    formData.add("key 1, "value 1");
    formData.add("key 2, "value 2");
    formData.add("key 3, "value 3");
    formData.add("key 4, "value 4");

ResponseEntity<String>  resp = webClient
   .post()
   .uri("https://myurl")
   .contentType(MediaType.APPLICATION_FORM_URLENCODED)
   .header(HttpHeaders.CONTENT_LENGTH,
        String.valueOf(???))
   .body(BodyInserters.fromFormData(formData))
   .exchange()
   .flatMap(response -> response.toEntity(String.class))
   .block();

我有办法。事实证明,这与 Content-Length 无关。我决定尝试使用 RestTemplate 访问同一个 REST 端点。我遇到了一个相同的错误,目标端点抱怨缺少参数。然而,当我使用 Postman 或 curl 访问它时,它工作得很好。

我没有使用 BodyInserters.fromFormData 和 MultiValueMap,而是使用了 BodyInserters.fromValue(bodyData)。对于主体数据,我构建了一个类似于 curl 使用的值的字符串。

grant_type=client_credentials&client_id=123&client_secret=456&scope=myScope

这个问题可能仅限于为这个 API(而不是 public 服务的主机),但我发现有趣的是 RestTemplate 和 WebClient 都失败了 x-www-form-urlencoded,而 Postman 和 curl 工作得很好。