Заголовок просто обозначает то, во что закодирован контент. Не обязательно можно определить тип контента из самого контента, то есть вы не можете просто смотреть на контент и знать, что с ним делать. Для этого и нужны 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.