2012-06-19 38 views
2

在我的Java應用程序中,我正在尋找流式版本URLEncoder.encode(String s, String enc)。我想使用「application/x-www-form-urlencoded」內容類型流式傳輸大量HTTP請求。這樣的事情是存在於圖書館還是開源項目中?還是有一個簡單的方法來實現它?流式URL編碼器

這是一個早期的嘗試,但不正確,因爲它不處理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")); 
    } 
} 
+0

你想發什麼?用戶輸入的文本非常大? –

回答

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 
} 
1

我想答案是我不應該試圖做到這一點。根據HTML Specification

內容類型「application/X WWW的窗體-urlencoded」是低效的,用於發送大量的二進制數據或包含非ASCII字符的文本。內容類型「multipart/form-data」應該用於提交包含文件,非ASCII數據和二進制數據的表單。

大多數服務器都會拒絕任何情況下超過一定長度的HTTP頭。

+1

是的,Apache將在8kB的頭部截斷。儘管在進行POST時,您可以儘可能多地在身體中傳遞。 –

+0

這種情況下的內容應該是請求頭部還是內容的一部分? – sallen

+0

@sallen Content = body。 – EJP