在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文本。
我的问题是:
- 你能在HTTP头中发送非ASCII文本吗?
- 如果可以的话,你怎么做? 当filename包含非ASCII文本时,上面的代码不起作用。 服务器响应“Bad Request 400”。
- 如果你不能,解决这个限制的典型方法是什么?
您不能在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头编码/解码