当前位置: 首页 > 知识库问答 >
问题:

应用程序的Spring WebClient POST和内容长度标头/x-www-form-urlencoded

潘佐
2023-03-14

我正在使用Spring WebClient和Spring Boot 2.3.5.Release向需要application/x-www-form-urlencoded内容类型的站点发布请求。它总是失败,因为没有设置Content-Length头。我可以在代码中设置,但我不确定当内容类型为application/x-www-form-urlencoded时如何计算内容长度。我正在访问的URL是一个遗留网站。我看到这篇文章缺少用WebClient(SpringBoot2.0.2.release)发送post请求的内容长度头,但它没有解决content-type=application/x-www-form-urlencoded的问题。

我在邮递员中执行了同样的请求,它工作得很好。在Postman中,如果删除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();

共有1个答案

张宝
2023-03-14

我有个解决办法。结果表明,这与内容长度无关。我决定尝试使用RESTTemplate访问相同的RESTendpoint。我得到了一个相同的错误,目标endpoint抱怨缺少参数。然而,当我用邮递员或卷曲访问它时,它工作得非常好。

我没有将bodyinserters.fromformdata与MultiValueMap一起使用,而是使用了bodyinserters.fromvalue(bodyData)。对于主体数据,我构建了一个与curl使用的值类似的字符串。

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

这个问题可能仅限于服务该API的主机(不是公共API),但我发现有趣的是,RestTemplate和WebClient在使用x-www-form-urlencoded的标准方法时都失败了,而Postman和curl工作得很好。

 类似资料:
  • 我试图访问这个REST API,它接受三个参数:,,我在AngularJS中这样做: 但我总是这样: 对象{data:“{”result:“false”},状态:200,配置:Object,状态文本:“OK”,标题:function} 或者 {"data":"{\"结果\":\"false\"}","状态": 200,"配置":{"方法":"POST","transformRequest":[nu

  • 我正在尝试使用,但数据没有到达PHP。我认为这是因为当使用标题始终设置为

  • 我以前有ElasticSearch 5.2,刚刚升级到6.0。 我试图创建一个索引模板以下指南在这里,但得到了错误 我的问题是

  • 我希望在客户端下载文件时向他们显示文件的大小。< br >但是HTTP头内容长度不起作用。< br >我环境如下。 阿帕奇 2.2 mod_deflate 轨道3.2 下载文件位于rails项目公用文件夹中。 当我下载它时,响应标头是这个。 接受范围字节 访问控制允许头...源,x 请求,内容类型 访问控制允许甲基...放置、获取、发布、删除、选项 访问控制-允许-原始...http://*.co

  • 我的要求很简单。 响应是xml格式的。 我尝试了很多地方的例子,但似乎没有任何效果。它返回401 Unauthorized,如果请求的格式不正确,目标API就会抛出这个错误。

  • 问题内容: 我曾经有ElasticSearch 5.2,并且刚升级到6.0。 我正在尝试按照此处的指南创建索引模板,但出现错误 我的查询是 问题答案: 要解决此问题,请添加curl选项 这个错误是由于 严格的内容类型检查 在ElasticSearch 6.0中引入,在解释这个岗位 从Elasticsearch 6.0开始,所有包含主体的REST请求也必须提供该主体的正确内容类型。