0

Apache Commons の HttpClient を使用して、バイナリ ファイルといくつかの文字列パラメーターを含むマルチパート POST 要求を送信しようとしています。

ただし、どこかで、ガベージ テキストが文字列パラメーターに入り込んでいるようです。たとえば、デバッガーで確認すると、sizeBodyここの変数は実際に値「100」を保持しています。

StringBody sizeBody = new StringBody("100", Charset.forName("UTF-8"));

ただし、Wireshark でリクエストをリッスンすると、次のように表示されます。

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa
Content-Disposition: form-data; name="x"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

100
a5

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa

a5の後に注意してください100

何が原因でしょうか? どこを見ればいいですか?

4

2 に答える 2

1

あなたが見ているのは、いわゆるチャンク転送エンコーディング [1] で使用されるチャンク ヘッダーである可能性があります。メッセージ ヘッドにTransfer-Encoding: chunkedフィールドがあるかどうかを確認します。

[1] http://en.wikipedia.org/wiki/Chunked_transfer_encoding

于 2011-05-12T12:12:51.267 に答える
0

NanoHTTPDを使用して POST をテストすると、同じ問題が発生しました。確かに、HttpClient は、NanoHTTPD がサポートしていないチャンク転送エンコーディングを使用しています。私の場合、バイナリファイルが を介して提供されたため、それを行いました。それはInputStreamBody、独自のコンテンツの長さを決定できないため (-1 を返すだけです)、クライアントはチャンクエンコーディングを使用します。

ByteArrayBodyファイル コンテンツにを使用するように切り替えました。これにより、 とStringBodyコンテンツの長さを指定できるようになったため、リクエストはチャンク エンコーディングを使用しなくなりました。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy (fileInputStream, baos);  // from Apache Commons IO, or roll your own
ContentBody filePart = new ByteArrayBody (baos.toByteArray(), fileName);

もちろん、ファイルが巨大な場合、上記のように全体をバイト配列にロードすると、メモリの問題が発生する可能性があります。

于 2012-05-10T15:04:22.073 に答える