在Http POST标头中发送非ASCII文本

时间:2011-03-09 20:34:56

标签: java

我将文件作为八位字节流发送到服务器,我需要在标题中指定文件名:

String filename = "«úü¡»¿.doc"
URL url = new URL("http://www.myurl.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.addRequestProperty("Accept", "application/json; charset=UTF-8");
conn.addRequestProperty("Content-Type", "application/octet-stream; charset=UTF-8");
conn.addRequestProperty("Filename", filename);
// do more stuff here

问题是,我需要发送的一些文件的文件名包含非ASCII字符。我已经读过你不能在HTTP标头中发送非ASCII文本。

我的问题是:

  1. 您可以在HTTP标头中发送非ASCII文本吗?
  2. 如果可以的话,你怎么做?当filename包含非ASCII文本时,上面的代码不起作用。服务器响应“Bad Request 400”。
  3. 如果你不能,那么典型的是什么 如何摆脱这种限制?

3 个答案:

答案 0 :(得分:6)

您不能在HTTP标头中使用非ASCII字符,请参阅RFC 2616.URI本身由RFC 2396标准化,也不允许非ASCII。 RFC说:

  

URI语法的设计具有全局可转录性      其主要关注点。 URI是一个非常的字符序列      有限集,即基本拉丁字母,数字,      和一些特殊的人物。

为了在URI中使用非ASCII字符,您需要使用%hexcode语法来转义它们(请参阅RFC 2396的第2节)。

在Java中,您可以使用java.net.URLEncoder类来完成此操作。

答案 1 :(得分:1)

实际上,您可以在标题中使用非ASCII字符(请参阅RFC 2616):

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   LWS            = [CRLF] 1*( SP | HT )

   CRLF           = CR LF

   CR             = <US-ASCII CR, carriage return (13)>

   LF             = <US-ASCII LF, linefeed (10)>

   SP             = <US-ASCII SP, space (32)>

   HT             = <US-ASCII HT, horizontal-tab (9)>

答案 2 :(得分:0)

这可能会有所帮助:HTTP headers encoding/decoding in Java