Die Kopfzeile gibt lediglich an, in welcher Sprache der Inhalt kodiert ist. Es ist nicht unbedingt möglich, aus dem Inhalt selbst auf die Art des Inhalts zu schließen, d. h. man kann nicht einfach auf den Inhalt schauen und wissen, was man mit ihm machen soll. Dafür sind die HTTP-Header da, die dem Empfänger mitteilen, mit welcher Art von Inhalt er es (vermeintlich) zu tun hat.
Content-type: application/json; charset=utf-8
bezeichnet den Inhalt im JSON-Format, kodiert in der Zeichenkodierung UTF-8. Die Angabe der Kodierung ist für JSON etwas überflüssig, da die Standardkodierung (die einzige?) für JSON UTF-8 ist. In diesem Fall ist der empfangende Server offenbar froh, dass er weiß, dass er es mit JSON zu tun hat, und geht davon aus, dass die Kodierung standardmäßig UTF-8 ist, weshalb er mit oder ohne Header funktioniert.
Begrenzt diese Kodierung die Zeichen, die im Nachrichtentext enthalten sein können?
Nein. Sie können in der Kopfzeile und im Textkörper alles senden, was Sie wollen. Aber wenn die beiden nicht übereinstimmen, können Sie falsche Ergebnisse erhalten. Wenn Sie im Header angeben, dass der Inhalt UTF-8 kodiert ist, Sie aber eigentlich Latin1 kodierte Inhalte senden, kann der Empfänger Datenmüll produzieren, weil er versucht, Latin1 kodierte Daten als UTF-8 zu interpretieren. Wenn Sie natürlich angeben, dass Sie Latin1-kodierte Daten senden und dies auch tatsächlich tun, dann sind Sie auf die 256 Zeichen beschränkt, die Sie in Latin1 kodieren können.