3

私の Java アプリでは、URLEncoder.encode(String s, String enc) のストリーミング バージョンを探しています。「application/x-www-form-urlencoded」コンテンツ タイプを使用して、大きな HTTP ポスト リクエストをストリーミングしたいと考えています。そのようなものは図書館やオープンソースプロジェクトに存在しますか? またはそれを実装する簡単な方法はありますか?

これは初期の試みでしたが、1 バイトより大きい UTF コードポイントを処理しないため、正しくありません。

// Incorrect attempt at creating a URLEncoder OutputStream
private class URLEncoderOutputStream extends FilterOutputStream
{
    public URLEncoderOutputStream(OutputStream out)
    {
        super(out);
    }

    @Override
    public void write(int b) throws IOException
    {
        String s = new String(new byte[] { (byte)b });
        String enc = URLEncoder.encode(s, "UTF-8");
        out.write(enc.getBytes("UTF-8"));
    }
}
4

2 に答える 2

3

問題は、OutputStreams が文字について何も知らず、バイトしか知らないことです。あなたが本当に欲しいのはWriterです、例えば

public class URLEncodedWriter extends FilterWriter {
    public void write(int c) {
        out.write(URLEncoder.encode((char)c, "UTF-8"));
    }
    ... // Same for 2 other write() methods
}
于 2012-06-19T20:59:05.863 に答える
1

答えは、私がこれをやろうとするべきではないということだと思います。HTML仕様によると:

コンテンツ タイプ「application/x-www-form-urlencoded」は、非 ASCII 文字を含む大量のバイナリ データまたはテキストを送信するのに非効率的です。ファイル、非 ASCII データ、およびバイナリ データを含むフォームを送信するには、コンテンツ タイプ「multipart/form-data」を使用する必要があります。

ほとんどのサーバーは、特定の長さを超える HTTP ヘッダーを拒否します。

于 2012-06-19T20:37:04.833 に答える