簡體   English   中英

REST Service-使用Jersey在https上以流形式進行多部分發布(JSON和文件)

[英]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>標頭,但這不能解決問題,因為網絡可能無法足夠可靠,您仍然必須重試。

您基本上有兩個選擇:

  1. 僅可重復使用ContentBody實現,例如FileBody或自己的可重復ContentBody實例。
  2. 確保不需要重試該請求。

請注意 ,后者並不總是可能的 如前所述,可以避免由於身份驗證失敗而導致的請求重試,但是由於I / O錯誤而導致的請求重試則無法避免。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM