gpt4 book ai didi

java - 如何从 Apache HttpClient 4.x 通过 HttpPut 上传 InputStream

转载 作者:行者123 更新时间:2023-11-30 05:41:41 28 4
gpt4 key购买 nike

我正在尝试使用 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.
<小时/>

想法#1:缓冲输入流

我可以用 BufferedHttpEntity 包装实体,使其可重复:

..
BufferedHttpEntity entity = new BufferedHttpEntity(new InputStreamEntity(inputStream));
method.setEntity(entity);
..

.. 但随后流首先被缓冲,然后总共发送,而不是分块/流式传输。这不适用于较大的文件。

<小时/>

想法#2:抢先身份验证

我可以添加具有正确身份验证的硬编码 header ,以防止重复请求。但正如我所说,我不知道身份验证方案。

<小时/>

想法#3:虚拟 FileEntity 上传以获取上下文(我当前的解决方案)

我首先上传一个空文件,获取上下文并将其添加到我的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com