Cuando hago una solicitud POST con un cuerpo JSON a mi servicio REST, lo incluyo Content-type: application/json; charset=utf-8
en el encabezado del mensaje. Sin este encabezado, recibo un error del servicio. También puedo usar con éxito Content-type: application/json
sin la ;charset=utf-8
porción.
¿Qué hace exactamente charset=utf-8
? Sé que especifica la codificación de caracteres, pero el servicio funciona bien sin ella. ¿Esta codificación limita los caracteres que pueden estar en el cuerpo del mensaje?
character-encoding
mime-types
DenaliHardtail
fuente
fuente
application/json
Registro de tipos de medios de IANA , no parece haber uncharset
parámetro compatible en absoluto, aunque a menudo se proporciona en la práctica.I know it specifies the character encoding but the service works fine without it.
"trabajar" no siempre significa "el código / configuración existente es la forma más correcta de cubrir todos los casos de esquina para hacer una cosa". Depende de todas las convenciones y suposiciones que pueden no funcionar en otras circunstancias. Para mí personalmente, siempre trato de ser lo más explícito posible.Respuestas:
El encabezado solo indica en qué está codificado el contenido. No es necesariamente posible deducir el tipo de contenido del contenido en sí mismo, es decir, no necesariamente puede mirar el contenido y saber qué hacer con él. Para eso están los encabezados HTTP, le dicen al destinatario con qué tipo de contenido están tratando (supuestamente).
Content-type: application/json; charset=utf-8
designa el contenido para que esté en formato JSON, codificado en la codificación de caracteres UTF-8. Designar la codificación es algo redundante para JSON, ya que la codificación predeterminada (¿solo?) Para JSON es UTF-8. Entonces, en este caso, el servidor receptor aparentemente está contento de saber que está tratando con JSON y supone que la codificación es UTF-8 de forma predeterminada, por eso funciona con o sin el encabezado.No. Puedes enviar lo que quieras en el encabezado y el cuerpo. Pero, si los dos no coinciden, puede obtener resultados incorrectos. Si especifica en el encabezado que el contenido está codificado en UTF-8 pero en realidad está enviando contenido codificado en Latin1, el receptor puede producir datos basura, intentando interpretar los datos codificados en Latin1 como UTF-8. Si, por supuesto, especifica que está enviando datos codificados en Latin1 y realmente lo está haciendo, entonces sí, está limitado a los 256 caracteres que puede codificar en Latin1.
fuente
\u20AC
.application/json
tiene que estar en uno de los formatos de transformación ucs. Además, dado que los primeros cuatro bytes de JSON son limitados, siempre se puede saber si es 8, 16 o 32 y su endianidad.charset=utf-8
por razones de seguridad: github.com/shieldfy/API-Security-Checklist/issues/25Para corroborar la afirmación de @ deceze de que la codificación JSON predeterminada es UTF-8 ...
Desde IETF RFC4627 :
fuente
"\u0000"
).xx 00 00 00
sigue siendo UTF-32LE yxx 00 xx xx
sigue siendo UTF-16LE,00 xx xx xx
sigue siendo UTF-16BE.Tenga en cuenta que IETF RFC4627 ha sido reemplazado por IETF RFC7158 . En la sección [8.1] se retrae el texto citado por @Drew anteriormente diciendo:
fuente
Estoy exactamente de acuerdo con @deceze pero quiero desarrollar esta parte de la pregunta "Recibo un error del servicio" ,
Recibimos este tipo de errores como http 415
El código de respuesta de error del cliente de tipo de medio HTTP 415 no compatible indica que el servidor se niega a aceptar la solicitud porque el formato de carga está en un formato no compatible.
El problema de formato puede deberse al Tipo de contenido o la Codificación de contenido indicados en la solicitud , o como resultado de la inspección directa de los datos.
En otras palabras, como se ve en https://stackoverflow.com/a/22643964/914284 este ejemplo.
fuente
La implementación de http de Dart procesa los bytes gracias a ese "charset = utf-8", por lo que estoy seguro de que varias implementaciones lo soportan, para evitar el juego de caracteres alternativo "latin-1" al leer los bytes de la respuesta. En mi caso, pierdo totalmente el formato en la cadena del cuerpo de la respuesta, por lo que debo codificar los bytes manualmente en utf8, o agregar ese parámetro "interno" de encabezado en la respuesta API de mi servidor.
fuente
Estaba usando HttpClient y recuperando el encabezado de respuesta con tipo de contenido
application/json
, perdí caracteres como idiomas extranjeros o símbolos que usaban unicode ya que HttpClient está predeterminado en ISO-8859-1 . Por lo tanto, sea lo más explícito posible como lo menciona @WesternGun para evitar cualquier posible problema.No hay forma de manejar que debido al servidor no maneja charset (
method.setRequestHeader("accept-charset", "UTF-8");
) de encabezado solicitado para mí y tuve que recuperar datos de respuesta como bytes de dibujo y convertirlos en String usando UTF-8. Por lo tanto, se recomienda ser explícito y evitar asumir el valor predeterminado.fuente