欲求不満であきらめて、この「古い学校のスタイル」を (Spring を使用せずに) 書き直す前に、Spring の HTTP クライアントに関する知識のある人が助けてくれることを願っています。
HTTP 経由で Web サービスに送信したい大規模なデータがいくつかあります。分割して発送できるようにしてほしいです。SimpleClientHttpRequestFactory
Spring のソース コードは、のsetBufferRequestBody
メソッドを呼び出してそのブール引数を に設定するfalse
と、結果ClientHttpRequest
がそのターゲットに「ストリーミング」されること、つまり「チャンク転送エンコーディング」が使用されることを明確にしています。ただし、注意点があります。チャンクエンコーディングの使用は、リクエストのコンテンツの長さが不明な場合にのみ発生します。
それが私の問題です。ぎこちなく言えば、コンテンツの長さを不明にする方法がわかりません。ここでのシナリオは、一度にすべてではなく小さなチャンクで送信したい大きなバイト配列である可能性があります。しかし、いくつかの適切なRestTemplate
呼び出し、たとえばexchange()
とpostForObject()
は、リクエストの内容とその長さを正確に認識しているように思えます。したがって、次のようなシーケンスで:
HttpEntity<Object> entity = new HttpEntity<Object>(payload, headers);
ResponseEntity<byte[]> response = null;
response = restTemplate.exchange(svcUrl, httpMethod, entity, byte[].class);
交換ロジックは を検査してHttpEntity
、リクエスト本文の長さを把握できます (サンプル コードでは、ペイロード)。したがって、リクエストはContent-Length
ヘッダー付きで送信されます。
非常に明白な何かを見逃しているに違いないと感じています。あなたがこれに当てることができる光に感謝します。
環境:
- いくつかの Spring コンポーネントのバージョン 3.2.3
- JDK1.7.0_40
- Windows 2008R2 (今のところ)