什么是“Content-type:application / json; charset = utf-8“真的是什么意思?

当我使用JSON正文向我的REST服务发出POST请求时,我包含Content-type: application/json; charset=utf-8 消息头中的Content-type: application/json; charset=utf-8 。 没有这个标题,我从服务中得到一个错误。 我也可以成功地使用Content-type: application/json而不使用;charset=utf-8部分。

charset=utf-8究竟干什么? 我知道它指定的字符编码,但没有它的服务工作正常。 这种编码是否限制了可以在消息体中的字符?

头只是表示内容编码的内容。从内容本身推断内容的types不一定是可能的,也就是说,不一定只是看内容,而知道如何处理内容。 这就是HTTP标头的用途,它告诉收件人他们(理应)处理什么样的内容。

Content-type: application/json; charset=utf-8 Content-type: application/json; charset=utf-8指定内容为JSON格式,以UTF-8字符编码编码。 对于JSON,指定编码有点多余,因为JSON的默认(仅?)编码是UTF-8。 所以在这种情况下,接收服务器显然很高兴知道它正在处理JSON,并假定默认编码为UTF-8,这就是为什么它可以使用或不使用标题。

这种编码是否限制了可以在消息体中的字符?

不可以。您可以在标题和正文中发送任何您想要的内容。 但是,如果两者不匹配,您可能会得到错误的结果。 如果您在标头中指定内容为UTF-8编码,但您实际上正在发送Latin1编码的内容,则接收器可能会产生垃圾数据,试图将Latin1编码的数据解释为UTF-8。 当然,如果你指定你正在发送Latin1编码的数据,而你实际上是这么做的,那么是的,你只能使用Latin1编码的256个字符。

为了证实@ deceze声称默认的JSON编码是UTF-8 …

来自IETF RFC4627 :

JSON文本应以Unicode编码。 默认编码是UTF-8。

由于JSON文本的前两个字符总是ASCII字符[RFC0020],因此可以确定八位字节stream是UTF-8,UTF-16(BE还是LE)还是UTF-32(BE或LE)通过查看前四个八位字节中的空值模式。

  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 

请注意, IETF RFC4627已被IETF RFC7158所取代。 在第[8.1]节中,它回顾了@Drew之前所说的文字:

 Implementations MUST NOT add a byte order mark to the beginning of a JSON text.