使用 InputStreamEntity 使用 httpclient 构建 http put 请求将不起作用,除非我明确传递内容长度



我正在尝试使用org.apache.httpcomponents 4.23版本的httpclient在scala中做http请求。特别是,我想使用InputStreamEntity来构建请求,以避免在内存中复制大型(~100Mb)字节数组。下面是代码片段:

val req = new HttpPut(url)
req setEntity new InputStreamEntity(contentStream, -1/*contentlength*/)
val client = new DefaultHttpClient(connManager, httpParams)
val resp = client execute req

代码url、connManager、httpParams在别处定义。代码的结果是在期望的位置上创建一个没有内容的文件。我正在测试一个有3个字节的内容流。创建带有内容长度作为参数显式设置为3的InputStreamEntity,将产生以正确方式创建文件的代码。由于在生产中有充分的理由,我不知道流的长度,因此我想使用负数来确保整个流被发送,直到InputStreamEntity的api发布,到达流的末端。我做错了什么?为什么我得到一个空文件时,没有显式设置内容长度?

不设置内容长度,将导致HTTP客户端切换到块传输编码

要使其工作,您要发送到的http服务器必须符合http 1.1。是吗?

相关内容

最新更新