2017-06-06 20 views
0

を使用して、HTTPS上のストリームとして、私はマルチパートとしてファイルアップロードを受け付け、HTTPS接続でRESTサービスを持っている(すなわちファイルのメタデータとファイル自体)RESTサービス - マルチパートポスト(JSONとファイル)ジャージー

どのようにすることができますJersey(websphereの場合)またはHttpClientを使用してRESTサービスを呼び出し、マルチパートとしてファイルを送信します。私は1GB以上のファイルを持つことができるので、さまざまなサイズの複数のストリームとしてファイルを送信したい。さらに、RESTサービスは認証にWindows NT認証を使用しており、httpsを使用しています。

どのように私はこれを達成することができます例を与えることができますか?私はmultipart 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では3つの要求呼び出しがサーバーに対して行われ、ファイルの内容全体がコピーされるたびに呼び出されます。したがって、ファイルが1GBの場合、コンテンツ全体がサーバーに3回送信されます。

第1に、1つの呼び出しでファイル全体が送信されないように、大きなファイルをチャンクまたは複数のストリームで送信する方法を教えてください。第二に、NTLM認証用のサーバーへの3回の呼び出しを避ける方法はありますか?

任意のポインタ?

乾杯!

+0

[Jersey 2 Multipart upload Client](https://stackoverflow.com/questions/24637038/jersey-2-multipart-upload-client) – andih

+0

の可能な複製です。このリンクは単純なHTTP接続を使用しています。認証を持っている。私の場合、RESTfulなサービスはhttps上にあり、NTLM認証メカニズムを使用しています。 NTLM認証メカニズムを使用してhttps上のRESTサービス経由でファイルをストリームとしてアップロードする(私は入力ストリームです)良い例はありますか?また、クライアントJavaアプリケーションが実行されるwebsphereもあります。サーバーは.Netに実装されています。 – sab123

+0

Apache HTTPクライアントはhttpとhttpsをサポートしています。ほとんどの場合、コードを変更する必要はありません。 NTLM認証は、httpの「上」のものです。 Apache Http Clients Version> 4.1(4.2.3)のサポート[NTLM](https://hc.apache.org/httpcomponents-client-ga/ntlm.html)。 1つの質問内で異なることを求めているようです。チャンクのアップロードはどのように重複していますか? NTLM認証スキームについては、[ここ](https://www.innovation.ch/personal/ronald/ntlm.html)を参照してください。 3回の呼び出しを避けることができれば。答えは「いいえ」です。より具体的な質問をする必要があります。 – andih

答えて

0

InputStreamBodyは(特に大きなストリームの場合)反復可能ではないため、例外が発生します。一般的なInputStreamは1回だけ読み取ることができます。

FileBodyは、ファイルを複数回読み取ることができるため、繰り返し可能です。

繰り返し可能な読み込みの理由の1つは(NTLM)認可(これをチェックしなかった)です。

あなたは Authorization: NTLM <base64-encoded type-3-message>ヘッダを送信する/実際の要求の前に最初の2つのNTML認証の手順を実行して設定することでこれを回避することができるが、ネットワークが十分に信頼性がないかもしれないので、それは、問題を解決しないと、あなたが再試行する必要がありますとにかく

あなたは基本的に2つのオプションがあります。

  1. FileBodyまたは自身の再現性ContentBodyインスタンスのように繰り返し可能ContentBody実装を使用します。
  2. 要求を再試行する必要がないことを確認してください。

後者は常にことはできませんに注意してください。前述したように、認証失敗による要求の再試行は回避できますが、I/Oエラーによる再試行はできません。

+0

これは、NTLM認証を使用してRESTサービスを使用してストリームとしてドキュメントを投稿できないこと、またはhttpClientの制限事項であることを意味しますか? Jerseyなどのように簡単に使える他のRESTクライアントAPIはありますか?本質的に反復不可能なので、ストリームとしての投稿が不可能な場合、httpClientを使用してInputStreamBodyが複数の場所として使用されますか? – sab123

+0

NTLMやクライアントの制限とは関係ありません。クライアントはストリームとして送信される 'FileBody'のように反復可能であるとすぐに投稿ストリームをサポートします。 'InputStream'と' File'の違いは、 'File'ではランダムアクセスのようなものを実装できます。つまり、一般的な' InputStreams'では、指定したポイントにジャンプすることはできません。また、要求を事前認証/許可することによって、認可事項(NTLM固有ではない)を克服できますが、依然としてIOエラーを処理する必要があります。あなたが何らかの作業をしなければならないように、この方法で使いたいと思うだけです。 – andih

+0

応答にAndihに感謝します。私はfilebodyがメモリ内のファイル全体をロードし、それをリクエストの一部として送信すると思った。 filebodyがストリームを内部的に使用している場合は、それがうまくいくはずです。私たちは、ファイルをアップロードするためのSOAP(基本認証)に相当するアップロードサービスを持っており、MTOMを有効にしてinputStreamを送信しています。現在のシナリオでは、RESTを使用して、一時ファイルを作成せずにSOAPで行っているのと同じ方法でinputStreamをRESTに送信できるかどうかを判断しようとしています。 – sab123

関連する問題