Когда я делаю POST-запрос с телом JSON в свой REST-сервис, я включаю его Content-type: application/json; charset=utf-8
в заголовок сообщения. Без этого заголовка я получаю ошибку от сервиса. Я также могу успешно использовать Content-type: application/json
без ;charset=utf-8
порции.
Что именно делает charset=utf-8
? Я знаю, что это определяет кодировку символов, но сервис работает без него. Эта кодировка ограничивает символы, которые могут быть в теле сообщения?
character-encoding
mime-types
DenaliHardtail
источник
источник
application/json
похоже, что поддерживаемыйcharset
параметр вообще отсутствует, хотя часто применяется на практике.I know it specifies the character encoding but the service works fine without it.
«работа» не всегда означает, что «существующий код / конфигурация является наиболее правильным способом, охватывающим все ключевые случаи, чтобы сделать одну вещь». Это зависит от всех условностей и предположений, которые могут не работать при других обстоятельствах. Лично я всегда стараюсь быть максимально откровенным.Ответы:
Заголовок просто указывает, во что закодирован контент. Не обязательно можно определить тип контента из самого контента, т.е. вы не можете просто смотреть на контент и знать, что с ним делать. Для этого и нужны HTTP-заголовки, они сообщают получателю, с каким контентом они (предположительно) имеют дело.
Content-type: application/json; charset=utf-8
обозначает контент в формате JSON, закодированный в кодировке символов UTF-8. Назначение кодировки несколько избыточно для JSON, поскольку кодировка по умолчанию (только?) Для JSON - это UTF-8. Таким образом, в этом случае принимающий сервер, по-видимому, счастлив, зная, что имеет дело с JSON, и предполагает, что кодировка UTF-8 по умолчанию, поэтому он работает с заголовком или без него.Нет. Вы можете отправлять все что угодно в шапке и теле. Но если два не совпадают, вы можете получить неправильные результаты. Если вы укажете в заголовке, что контент имеет кодировку UTF-8, но на самом деле вы отправляете контент с кодировкой Latin1, получатель может выдавать мусорные данные, пытаясь интерпретировать данные с кодировкой Latin1 как UTF-8. Если, конечно, вы указываете, что отправляете данные в кодировке Latin1, и на самом деле делаете это, то да, вы ограничены 256 символами, которые вы можете кодировать в Latin1.
источник
\u20AC
.application/json
должен быть в одном из форматов преобразования ucs. Кроме того, поскольку первые четыре байта JSON ограничены, вы всегда можете определить, является ли он 8, 16 или 32 и его порядковый номер.charset=utf-8
по соображениям безопасности: github.com/shieldfy/API-Security-Checklist/issues/25Чтобы обосновать утверждение @ deceze о том, что кодировка JSON по умолчанию - UTF-8 ...
Из IETF RFC4627 :
источник
"\u0000"
).xx 00 00 00
все еще UTF-32LE иxx 00 xx xx
все еще UTF-16LE,00 xx xx xx
все еще UTF-16BE.Обратите внимание, что IETF RFC4627 был заменен IETF RFC7158 . В разделе [8.1] он убирает текст, процитированный ранее @Drew, говоря:
источник
Я полностью согласен с @deceze, но я хочу развить эту часть вопроса «Я получаю ошибку от службы» ,
Мы получаем такие ошибки как http 415
Код ответа об ошибке клиента HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, потому что формат полезной нагрузки находится в неподдерживаемом формате.
Проблема с форматированием может быть связана с указанным в запросе Content-Type или Content-Encoding или из-за прямой проверки данных.
Другими словами, как показано в https://stackoverflow.com/a/22643964/914284 в этом примере.
источник
Реализация Dart http обрабатывает байты благодаря этому charset = utf-8, так что я уверен, что несколько реализаций поддерживают это, чтобы избежать «латинской-1» кодировки отката при чтении байтов из ответа. В моем случае я полностью теряю формат в строке тела ответа, поэтому мне приходится вручную кодировать байты в utf8 или добавлять этот параметр "inner" заголовка в ответ API моего сервера.
источник
Я использовал HttpClient и получал ответный заголовок с типом содержимого
application/json
, я потерял символы, такие как иностранные языки или символ, который использовал Unicode, так как HttpClient по умолчанию является ISO-8859-1 . Так что будьте явными, как упомянуто @WesternGun, чтобы избежать любой возможной проблемы.Нет способа справиться с тем, что из-за того, что сервер не обрабатывает charset (
method.setRequestHeader("accept-charset", "UTF-8");
) запрашиваемого заголовка для меня, мне пришлось извлекать данные ответа в виде байтов отрисовки и преобразовывать их в String, используя UTF-8. Поэтому рекомендуется быть явным и избегать предположения о значении по умолчанию.источник