1

ApacheHTTPクライアントを使用してHttpPOSTリクエストを作成しようとしています。HTTP POSTリクエスト(アプリケーションで受信)の内容を別のHTTP POSTリクエスト(アプリケーションから別のURLに開始)にコピーしようとしています。コードを以下に示します。

httpPost = new HttpPost(inputURL);
// copy headers
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
      String headerName = e.nextElement().toString(); 
      httpPost.setHeader(headerName, request.getHeader(headerName));
}

BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream());
BasicHttpEntity basicHttpEntity = new BasicHttpEntity();
basicHttpEntity.setContent(clientToProxyBuf);
basicHttpEntity.setContentLength(clientToProxyBuf.available());

httpPost.setEntity(basicHttpEntity);

HttpResponse responseFromWeb = httpclient.execute(httpPost);

基本的に、私はパラメータとしてURLを取得し、URLへのリクエストを転送してから、カスタムのルックアンドフィールでページなどを提供するプロキシアプリケーションを実装しようとしています。

これがHttpServletRequestrequestです。コンテンツの長さの設定で問題が発生しています。clientToProxyBuf.available()デバッグを通じて、正しい長さの入力ストリームが得られず、Httpエラー400IEとChromeが発生していることがわかりましたError 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection

私はそれを間違っていますか?それを達成する他の方法はありますか?

4

2 に答える 2

1

このavailable()関数は、ストリームのコンテンツの実際の長さを提供するのではなく、

この入力ストリームからブロックせずに読み取ることができるバイト数を返します。(javadocから)

ストリームオブジェクトを渡すのではなく、最初にストリームからコンテンツ全体を読み取り、次にそれをコンテンツに設定することをお勧めします。そうすれば、コンテンツの実際の長さもわかります。

于 2012-07-26T06:36:35.200 に答える
1

それはかなり単純で非常に明白でした。ヘッダーからコンテンツの長さを次のように取得する必要がありました。

basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
于 2012-07-26T07:13:56.693 に答える