作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Apache HttpClient 4.5.6 通过 HttpPut
上传 InputStream
:
InputStream inputStream = ..
CredentialsProvider provider = ..
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
HttpPut method = new HttpPut("MY_REMOTE_URL");
InputStreamEntity entity = new InputStreamEntity(inputStream);
method.setEntity(entity);
client.execute(method);
上传需要身份验证,在我的情况下,我不知道服务器是否使用摘要身份验证或基本身份验证,因此客户端会自动发送多个请求来确定身份验证方案。但是 InputStreamEntity
是不可重复的,导致以下错误:
org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.
<小时/>
我可以用 BufferedHttpEntity
包装实体,使其可重复:
..
BufferedHttpEntity entity = new BufferedHttpEntity(new InputStreamEntity(inputStream));
method.setEntity(entity);
..
.. 但随后流首先被缓冲,然后总共发送,而不是分块/流式传输。这不适用于较大的文件。
<小时/>我可以添加具有正确身份验证的硬编码 header ,以防止重复请求。但正如我所说,我不知道身份验证方案。
<小时/>我首先上传一个空文件,获取上下文并将其添加到我的 InputStream PUT 请求中:
HttpPut testMethod = new HttpPut("MY_REMOTE_DUMMY_URL");
FileEntity testEntity = new FileEntity(testFile);
testMethod.setEntity(testEntity);
HttpContext context = new BasicHttpContext();
client.execute(testMethod, context);
// .. delete the testEntity from server ..
HttpPut method = new HttpPut("MY_REMOTE_URL");
InputStreamEntity entity = new InputStreamEntity(inputStream);
method.setEntity(entity);
client.execute(method, context);
它可以工作,但看起来像是一个黑客。我应该这样做吗?有替代方案吗?
最佳答案
改为激活expect- continue
握手。
HttpClientContext context = HttpClientContext.create();
RequestConfig config = RequestConfig.custom().setExpectContinueEnabled(true).build();
context.setRequestConfig(config);
关于java - 如何从 Apache HttpClient 4.x 通过 HttpPut 上传 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516623/
我是一名优秀的程序员,十分优秀!