Lorsque je fais une demande POST avec un corps JSON à mon service REST, j'inclus Content-type: application/json; charset=utf-8
dans l'en-tête du message. Sans cet en-tête, je reçois une erreur du service. Je peux également utiliser avec succès Content-type: application/json
sans la ;charset=utf-8
portion.
Que fait exactement charset=utf-8
? Je sais que cela spécifie l'encodage des caractères mais le service fonctionne bien sans lui. Cet encodage limite-t-il les caractères pouvant figurer dans le corps du message?
character-encoding
mime-types
DenaliHardtail
la source
la source
application/json
enregistrement de type de média de l'IANA , il ne semble pas y avoir decharset
paramètre pris en charge du tout, bien qu'il soit souvent fourni dans la pratique.I know it specifies the character encoding but the service works fine without it.
«travailler» ne signifie pas toujours «le code / la configuration existante est la manière la plus correcte de couvrir tous les cas de coin pour faire une chose». Cela dépend de toutes les conventions et hypothèses qui peuvent ne pas fonctionner dans d'autres circonstances. Pour moi personnellement, j'essaie toujours d'être aussi explicite que possible.Réponses:
L'en-tête indique simplement dans quoi le contenu est codé. Il n'est pas nécessairement possible de déduire le type du contenu du contenu lui-même, c'est-à-dire que vous ne pouvez pas nécessairement simplement regarder le contenu et savoir quoi en faire. C'est à cela que servent les en-têtes HTTP, ils indiquent au destinataire à quel type de contenu ils sont (censément) confrontés.
Content-type: application/json; charset=utf-8
désigne le contenu au format JSON, codé dans le codage de caractères UTF-8. La désignation du codage est quelque peu redondante pour JSON, car le codage par défaut (uniquement?) Pour JSON est UTF-8. Donc, dans ce cas, le serveur de réception est apparemment heureux de savoir qu'il traite JSON et suppose que l'encodage est UTF-8 par défaut, c'est pourquoi il fonctionne avec ou sans en-tête.Non. Vous pouvez envoyer tout ce que vous voulez dans l'en-tête et le corps. Mais, si les deux ne correspondent pas, vous pouvez obtenir des résultats erronés. Si vous spécifiez dans l'en-tête que le contenu est encodé en UTF-8 mais que vous envoyez en fait du contenu encodé en Latin1, le récepteur peut produire des données inutiles, essayant d'interpréter les données encodées en Latin1 comme UTF-8. Si bien sûr vous spécifiez que vous envoyez des données encodées en Latin1 et que vous le faites réellement, alors oui, vous êtes limité aux 256 caractères que vous pouvez encoder en Latin1.
la source
\u20AC
.application/json
doit être dans l'un des formats de transformation ucs. De plus, comme les quatre premiers octets de JSON sont limités, vous pouvez toujours dire s'il s'agit de 8, 16 ou 32 et de son endianité.charset=utf-8
pour des raisons de sécurité: github.com/shieldfy/API-Security-Checklist/issues/25Pour justifier l'affirmation de @ deceze selon laquelle l'encodage JSON par défaut est UTF-8 ...
De l' IETF RFC4627 :
la source
"\u0000"
).xx 00 00 00
est toujours UTF-32LE etxx 00 xx xx
est toujours UTF-16LE,00 xx xx xx
est toujours UTF-16BE.Notez que l' IETF RFC4627 a été remplacé par l' IETF RFC7158 . Dans la section [8.1], il rétracte le texte cité par @Drew plus tôt en disant:
la source
Je suis exactement d'accord avec @deceze, mais je souhaite développer cette partie de la question "Je reçois une erreur du service" ,
Nous obtenons ce genre d'erreurs comme http 415
Le code de réponse d'erreur du client de type de support HTTP 415 non pris en charge indique que le serveur refuse d'accepter la demande car le format de la charge utile est dans un format non pris en charge.
Le problème de format peut être dû au type de contenu ou au codage de contenu indiqué dans la demande , ou à l'inspection directe des données.
En d'autres termes, comme vu dans https://stackoverflow.com/a/22643964/914284 cet exemple.
la source
L'implémentation de Dart http traite les octets grâce à ce "charset = utf-8", donc je suis sûr que plusieurs implémentations le supportent, pour éviter le jeu de caractères de secours "latin-1" lors de la lecture des octets de la réponse. Dans mon cas, je perds totalement le format sur la chaîne du corps de la réponse, donc je dois faire l'encodage des octets manuellement dans utf8, ou ajouter ce paramètre "interne" d'en-tête sur la réponse API de mon serveur.
la source
J'utilisais HttpClient et récupérais l'en-tête de réponse avec le type de contenu de
application/json
, j'ai perdu des caractères tels que des langues étrangères ou des symboles qui utilisaient unicode car HttpClient est par défaut ISO-8859-1 . Donc, soyez aussi explicite que possible comme mentionné par @WesternGun pour éviter tout problème possible.Il n'y a aucun moyen de gérer le fait que le serveur ne gère pas charset (
method.setRequestHeader("accept-charset", "UTF-8");
) d' en-tête demandé pour moi et j'ai dû récupérer les données de réponse sous forme d'octets de dessin et les convertir en chaîne en utilisant UTF-8. Il est donc recommandé d'être explicite et d'éviter l'hypothèse d'une valeur par défaut.la source