在我沮丧地放弃并重写这种“老派风格”(不使用 Spring)之前,我希望了解 Spring 的 HTTP 客户端内容的人可以帮助我。
我有一些想要通过 HTTP 发送到 Web 服务的大型数据。我希望能够分块发送。Spring 源代码清楚地表明,如果您调用SimpleClientHttpRequestFactory
'setBufferRequestBody
方法,将其布尔参数设置为false
,结果ClientHttpRequest
将“流式传输”到其目标,即,它将使用“分块传输编码”。但是,有一个警告:只有在请求内容长度未知时才会使用分块编码。
这就是我的问题。尴尬地说,我无法弄清楚如何使内容长度未知。这里的一个场景可能是一个大字节数组,我想以较小的块而不是一次全部发送。但在我看来,几个相关的RestTemplate
调用,例如exchange()
和postForObject()
,确切地知道请求内容是什么以及它有多长。所以,按照这样的顺序:
HttpEntity<Object> entity = new HttpEntity<Object>(payload, headers);
ResponseEntity<byte[]> response = null;
response = restTemplate.exchange(svcUrl, httpMethod, entity, byte[].class);
交换逻辑可以检查HttpEntity
以找出请求正文的长度(在我的示例代码中为有效负载)。因此,请求带有Content-Length
标头发送。
我觉得我一定错过了一些非常明显的东西。我很感激你能对此有所了解。
环境:
- 3.2.3 版本的几个 Spring 组件
- JDK 1.7.0_40
- Windows 2008R2(目前)