我正在嘗試使用阿帕奇4.5.6上傳一個通路:InputStreamHttpPutInputStream 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);上傳需要身份驗證,在我的情況下,我不知道服務器是使用摘要式身份驗證還是基本身份驗證,因此客戶端會自動發送多個請求來確定身份驗證方案。但是是不可重復的 ,導致以下錯誤:InputStreamEntityorg.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:先發制人的身份驗證我可以添加具有正確身份驗證的硬編碼標頭,以防止重復請求。但正如我所說,我不知道身份驗證方案。想法#3:虛擬文件實體上傳以獲取上下文(我當前的解決方案)我首先上傳一個空文件,收集上下文并將其添加到我的輸入流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);它有效,但它似乎是一個黑客。我應該這樣做嗎?還有其他選擇嗎?
1 回答

猛跑小豬
TA貢獻1858條經驗 獲得超8個贊
請改為激活握手。expect-continue
HttpClientContext context = HttpClientContext.create();
RequestConfig config = RequestConfig.custom().setExpectContinueEnabled(true).build();
context.setRequestConfig(config);
添加回答
舉報
0/150
提交
取消