3

在我的 Java 应用程序中,我正在寻找URLEncoder.encode(String s, String enc)的流式传输版本。我想使用“application/x-www-form-urlencoded”内容类型流式传输大型 HTTP 发布请求。这样的东西是否存在于图书馆或开源项目中?或者有没有简单的方法来实现它?

这是一个早期的尝试,但不正确,因为它不处理大于一个字节的 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 对字符一无所知,只知道字节。你真正想要的是一个作家,例如

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 字符的文本效率低下。内容类型“multipart/form-data”应用于提交包含文件、非 ASCII 数据和二进制数据的表单。

大多数服务器在任何情况下都会拒绝超过一定长度的 HTTP 标头。

于 2012-06-19T20:37:04.833 回答