当我用JSON主体向我的REST服务发出POST请求时,我包括Content-type: application/ JSON;消息头中的Charset =utf-8。如果没有这个报头,我将从服务中得到一个错误。我也可以成功地使用Content-type: application/json而不使用;charset=utf-8部分。
charset=utf-8到底做什么?我知道它指定了字符编码,但没有它服务也能正常工作。这种编码是否限制了可以出现在消息体中的字符?
当我用JSON主体向我的REST服务发出POST请求时,我包括Content-type: application/ JSON;消息头中的Charset =utf-8。如果没有这个报头,我将从服务中得到一个错误。我也可以成功地使用Content-type: application/json而不使用;charset=utf-8部分。
charset=utf-8到底做什么?我知道它指定了字符编码,但没有它服务也能正常工作。这种编码是否限制了可以出现在消息体中的字符?
当前回答
我正在使用HttpClient,并返回应用程序/json内容类型的响应头,我丢失了一些字符,例如使用unicode的外语或符号,因为HttpClient默认为ISO-8859-1。所以,就像@ westergun提到的那样,尽可能明确,以避免任何可能的问题。
没有办法处理,因为服务器不处理请求头字符集(方法。setRequestHeader("accept-charset", "UTF-8");)为我,我必须检索响应数据作为绘制字节,并使用UTF-8将其转换为字符串。因此,建议是明确的,避免假设默认值。
其他回答
我正在使用HttpClient,并返回应用程序/json内容类型的响应头,我丢失了一些字符,例如使用unicode的外语或符号,因为HttpClient默认为ISO-8859-1。所以,就像@ westergun提到的那样,尽可能明确,以避免任何可能的问题。
没有办法处理,因为服务器不处理请求头字符集(方法。setRequestHeader("accept-charset", "UTF-8");)为我,我必须检索响应数据作为绘制字节,并使用UTF-8将其转换为字符串。因此,建议是明确的,避免假设默认值。
JSON必须用UTF-8编码,并且没有“charset”参数。
RFC 8259:
IANA的考虑 JSON文本的媒体类型是application/ JSON。 ... 注意:此注册没有定义“charset”参数。 增加一个对顺从的接受者没有任何影响。
同时,
8.1. Character Encoding JSON text exchanged between systems that are not part of a closed ecosystem MUST be encoded using UTF-8 [RFC3629]. Previous specifications of JSON have not required the use of UTF-8 when transmitting JSON text. However, the vast majority of JSON- based software implementations have chosen to use the UTF-8 encoding, to the extent that it is the only encoding that achieves interoperability. Implementations MUST NOT add a byte order mark (U+FEFF) to the beginning of a networked-transmitted JSON text. In the interests of interoperability, implementations that parse JSON texts MAY ignore the presence of a byte order mark rather than treating it as an error.
(强调我的)
我完全同意@欺骗,但我想发展这个“我从服务中得到一个错误”的问题部分,
我们得到这种错误作为http 415
Http 415不支持的媒体类型错误
HTTP 415不支持的媒体类型客户端错误响应代码表示服务器拒绝接受请求,因为负载格式是不支持的格式。
格式问题可能是由于请求指定的Content-Type或Content-Encoding,或者是直接检查数据的结果。
换句话说,这个例子就是这样。
我们必须设置正确的内容类型,我们必须接受正确的内容类型 添加内容类型:application/json和接受:application/json。否则,它将假设默认值
请注意,IETF RFC4627已被IETF RFC7158所取代。在第[8.1]节中,它撤回了@Drew之前引用的文本,说:
实现绝对不能在JSON文本的开头添加字节顺序标记。
Dart http的实现处理字节多亏了“charset=utf-8”,所以我相信有几个实现支持这一点,以避免从响应中读取字节时的“latin-1”回切字符集。 在我的例子中,我完全丢失了响应体字符串的格式,所以我必须手动对utf8进行字节编码,或者在服务器的API响应上添加头“内部”参数。