¿Qué significa realmente "Content-type: application / json; charset = utf-8"?


Cuando hago una solicitud POST con un cuerpo JSON a mi servicio REST incluyo Content-type: application/json; charset=utf-8 en el encabezado del mensaje. Sin este encabezado, obtengo un error del servicio. También puedo usar con éxito Content-type: application/json sin la porción ;charset=utf-8.

¿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?

Author: DenaliHardtail, 2012-02-13

3 answers

El encabezado solo indica en qué está codificado el contenido. No es necesariamente posible deducir el tipo de contenido del contenido en sí, es decir, no necesariamente puedes 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 (supuestamente) están tratando.

Content-type: application/json; charset=utf-8 designa el contenido que debe estar en formato JSON, codificado en la codificación de caracteres UTF-8. La designación de la codificación es algo redundante para JSON, desde el valor predeterminado (only?) la codificación para JSON es UTF-8. Así que en este caso el servidor receptor aparentemente está contento sabiendo que está tratando con JSON y asume que la codificación es UTF-8 por defecto, es por eso que funciona con o sin el encabezado.

¿Esta codificación limita los caracteres que pueden estar en el cuerpo del mensaje?

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, tratando de 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.

 217
Author: deceze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-13 02:49:43

Para corroborar la afirmación de @deceze de que la codificación JSON predeterminada es UTF-8...

De IETF RFC4627 :

El texto JSON se codificará en Unicode. La codificación predeterminada es UTF-8.

Dado que los dos primeros caracteres de un texto JSON siempre serán ASCII caracteres [RFC0020], es posible determinar si un octeto la corriente es UTF-8, UTF-16 (BE o LE), o UTF-32 (BE o LE) mirando en el patrón de nulos en los primeros cuatro octetos.

      00 00 00 xx  UTF-32BE
      00 xx 00 xx  UTF-16BE
      xx 00 00 00  UTF-32LE
      xx 00 xx 00  UTF-16LE
      xx xx xx xx  UTF-8
 129
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-19 10:44:46

Tenga en cuenta que IETF RFC4627ha sido reemplazado por IETF RFC7158. En la sección [8.1] se retracta del texto citado por @ Drew antes diciendo:

Implementations MUST NOT add a byte order mark to the beginning of a JSON text.
 15
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-12 14:29:32