httpheaders getrequest generate ejemplo java http http-headers

getrequest - request in java



Caracteres ilegales en encabezados HTTP (1)

Estoy creando una HttpUrlConnection y necesito establecer múltiples encabezados personalizados.

Me gustaría hacer algo como lo siguiente, pero el contenido del mapa de encabezado debe provenir de una sola cadena. ¿Hay algún carácter que sea ilegal o que se use muy poco en los nombres de los encabezados HTTP y en los valores del encabezado HTTP?

HashMap<String, String> headers = new HashMap<String, String>(); // TODO: How can I fill the headers map reliably from a single string? HttpURLConnection c = (HttpURLConnection) url.openConnection(); for(Map.Entry<String, String> e : headers.entrySet()) c.setRequestProperty(e.getKey(), e.getValue());

Solución por ahora

No parece que los nombres de los encabezados HTTP contengan espacios (por lo general, ¿usan el dash?), Así que puedo separar el nombre con el valor usando un solo espacio. En cuanto a los conjuntos nombre-valor, parece que estoy jodido, ya que el valor puede contener casi cualquier cosa de acuerdo con la respuesta dada. Así que acabo de elegir un personaje, estoy bastante seguro de que probablemente nunca se use: § . Si resulta que realmente es necesario, tendré que ajustar mi código: p

Header1 Value1§Header2 Value2§Header3 Header3


[La respuesta aceptada de @ Stephen-c es sustancialmente errónea, por lo que parece que vale la pena corregir el registro, a pesar de que la pregunta es bastante antigua.]

El BNF relevante de RFC7230 es:

field-name = token token = 1*tchar tchar = "!" / "#" / "$" / "%" / "&" / "''" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA

El juego de caracteres es visible USASCII.

RFC 7230 es más reciente que su pregunta, pero en los detalles relevantes, no cambia lo que fue formalmente dicho por RFC 2616.

Existe una convención muy fuerte para los nombres de campo que es mucho más restrictiva que lo que permite el RFC, y esto se aplica en varios grados en varias implementaciones. Por lo general, los nombres de campo siguen un patrón de una secuencia de palabras [ASCII / NUMERAL] con la primera letra (solo) de cada palabra que se escribe en mayúscula. Las palabras están separadas por un solo guión.

Entonces, por ejemplo, se suponía que "HttpUrlConnection" era un nombre de encabezado HTTP (en lugar de un token de Java), lo llamarías ''Http-Url-Connection''.

Recuerdo tenuemente que una vez rastreado un error hasta alguna implementación era lo suficientemente estricto como para no admitir múltiples mayúsculas en una palabra (que resultó ser un acrónimo). Vale la pena seguir este formato más restringido muy estrictamente.

@ Stephen-c es incorrecto en eso:

  • ISO-8859-1 no juega ningún papel en los nombres de campo, aunque puede usarse en valores de campo.

  • El problema de escapar en nombres de campo no es turbio en lo más mínimo. No es compatible con el estándar.

  • https://bugzilla.mozilla.org/show_bug.cgi?id=601933 se refiere a una implementación de valor de campo particular, no a un nombre de campo.