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 工作得很好。
我正在使用 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
我在 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 工作得很好。