[英]REST Service - Multipart Post (JSON and File) as stream on https using Jersey
我在https連接上有一個REST服務,該服務接受文件上傳為多部分(即文件的元數據和文件本身)
如何使用Jersey(對於Websphere)或HttpClient調用REST服務並將文件作為多部分發送。 我希望以不同大小的多個流發送文件,因為我們可以擁有超過1GB的文件。 此外,REST服務使用Windows NT身份驗證進行授權,並且位於https上。
誰能舉例說明我如何實現這一目標? 我已經使用了多部分的httpClient。 將其作為流發送不起作用。 下面是我使用httpClient 4.5.2的代碼
====================================
InputStream stream = new FileInputStream("test.doc");
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setStrictMode();
InputStreamBody streamBody = new InputStreamBody(stream, docHandler.getFilename());
FormBodyPart filePart = FormBodyPartBuilder.create()
.setName("Binary")
.addField(Constants.RETRIEVAL_NAME_FIELD, "test.doc")
.addField("Content-Type",docHandler.getContentType())
.setBody(streamBody)
.build();
entityBuilder.addPart(filePart);
HttpPost httpPostRequest = new HttpPost();
httpPostRequest.setEntity(entityBuilder.build());
httpClient.execute(httpPostRequest);
===================================但是,當我執行此代碼時,出現以下錯誤
org.apache.http.client.NonRepeatableRequestException:無法使用不可重復的請求實體重試請求
知道為什么我會收到此錯誤。 如果我將流轉換為字節數組並使用ByteArrayBody代替,那么它可以正常工作,但是我在Fiddler中注意到對服務器進行了三個請求調用,並且在每個調用中都將復制文件的整個內容。 因此,如果我的文件大小為1GB,則全部內容將被發送到服務器3次。
首先,如何實現以塊或多個流發送大文件,以使整個文件不會在一個調用中發送。 其次,有沒有一種方法可以避免對NTLM身份驗證進行3次服務器調用?
有指針嗎?
干杯!
發生異常是因為InputStreamBody
是不可重復的(尤其是對於大型流)。 常規InputStream
只能讀取一次。
FileBody
是可重復的,因為可以多次讀取文件。
可重復讀取的原因之一可能是(NTLM)授權(未選中此項)。
您可以通過在實際請求之前執行前兩個NTML授權步驟並設置/發送Authorization: NTLM <base64-encoded type-3-message>
來避免此問題Authorization: NTLM <base64-encoded type-3-message>
標頭,但這不能解決問題,因為網絡可能無法足夠可靠,您仍然必須重試。
您基本上有兩個選擇:
ContentBody
實現,例如FileBody
或自己的可重復ContentBody
實例。 請注意 ,后者並不總是可能的 。 如前所述,可以避免由於身份驗證失敗而導致的請求重試,但是由於I / O錯誤而導致的請求重試則無法避免。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.