2011-03-09 9 views
5

estoy enviando un archivo a un servidor como un octeto-corriente, y tengo que especificar el nombre de archivo en el encabezado:el envío de texto no ASCII en la cabecera HTTP POST

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 

El problema es que algunos de los archivos que necesito enviar tienen nombres de archivo que contienen caracteres que no son ASCII. He leído que no puede enviar texto que no sea ASCII en un encabezado HTTP.

Mis preguntas son:

  1. ¿Puede enviar mensajes de texto no ASCII en una cabecera HTTP?
  2. Si puede, ¿cómo hace esto? El código anterior no funciona cuando el nombre del archivo contiene texto que no es ASCII. El servidor responde con "Bad Request 400".
  3. Si no puede, ¿cuál es la forma típica de evitar esta limitación?

Respuesta

4

No puede utilizar caracteres no ASCII en las cabeceras HTTP, consulte el RFC 2616. URI son a su vez estandarizada por el RFC 2396 y no permiten no ASCII tampoco. El RFC dice:

La sintaxis de URI se diseñó con la transcripción mundial como uno de sus principales preocupaciones. Un URI es una secuencia de caracteres de un conjunto limitado muy , es decir, las letras del alfabeto latino básico, dígitos, y algunos caracteres especiales.

Para utilizar caracteres que no sean ASCII en el URI, debe escapar de ellos utilizando la sintaxis% hexcode (consulte la sección 2 de RFC 2396).

En Java puede hacerlo utilizando la clase java.net.URLEncoder.

+0

Hmmm, aún no funciona. Lo hice: conn.addRequestProperty ("Filename", URLEncoder.encode (filename)); – guest99

1

En realidad, puede utilizar caracteres no ASCII en la cabecera (ver 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)> 
+1

RFC 2616 dice que SOLAMENTE puede usar US-ASCII en encabezados HTTP. Otros personajes tienen que estar codificados. – saille