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

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

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. 如果你不能,解决这个限制的典型方法是什么?

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

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

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

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

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

  message-header = field-name ":" [ field-value ] field-name = token field-value = *( field-content | LWS ) field-content =  TEXT =  CTL =  LWS = [CRLF] 1*( SP | HT ) CRLF = CR LF CR =  LF =  SP =  HT =  

这可能会有所帮助: Java头中的HTTP头编码/解码