接受和接受 - Charset - 哪个优越?

Pau*_*ner 46 http http-headers

在HTTP中,您可以在请求中指定您的客户端可以使用accept标头接受响应中的特定内容,其值为application/xml.内容类型规范允许您在内容类型中包含参数,例如charset=utf-8,表示您可以接受具有指定字符集的内容.

还有accept-charset标题,它指定客户端接受的字符编码.

如果指定了两个标头,并且accept标头包含带有charset参数的内容类型,那么服务器应该将其视为高级标头?

例如:

Accept: application/xml; q=1,
        text/plain; charset=ISO-8859-1; q=0.8
Accept-Charset: UTF-8
Run Code Online (Sandbox Code Playgroud)

我已经使用Fiddler向各种服务器发送了一些示例请求来测试它们的响应方式:

例子

W3

请求

GET http://www.w3.org/ HTTP/1.1
Host: www.w3.org
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

响应

Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

谷歌

请求

GET http://www.google.co.uk/ HTTP/1.1
Host: www.google.co.uk
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

响应

Content-Type: text/html; charset=ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

堆栈溢出

请求

GET http://stackoverflow.com/ HTTP/1.1
Host: stackoverflow.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

响应

Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

微软

请求

GET http://www.microsoft.com/ HTTP/1.1
Host: www.microsoft.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

响应

Content-Type: text/html
Run Code Online (Sandbox Code Playgroud)

关于预期的行为似乎没有任何共识.我想看起来很惊讶.

Pau*_*ulo 36

尽管您可以在Accept标头中设置媒体类型,但charset该媒体类型的参数定义未在RFC 2616中的任何位置定义(但不禁止).

因此,如果要实现符合HTTP 1.1的服务器,则应首先查找Accept-charset标头,然后在Accept标头处搜索自己的参数.


Rem*_*eau 13

阅读RFC 2616第14.1和14.2节.该Accept头不允许你指定一个charset.你必须改用Accept-Charset标题.

  • RFC 2616表明内容类型包含参数是可以接受的.根据RFC 2046,`charset`是一个特定的参数:http://tools.ietf.org/html/rfc2046#section-4.1.2我在`Accept`中没有看到任何明确禁止此参数的内容或澄清了如何当它们与`Accept-Charset`一起使用时处理这些参数 (2认同)
  • 但是,在`Accept`标题中使用`charset`参数并没有在任何地方定义.为此目的定义了`Accept-Charset`头.这就是服务器将要寻找的东西. (2认同)
  • charset是有效的.参见[RFC 2616第3.7节](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html),该专门委托给IANA并明确声明"参数的存在与否可能对处理媒体类型,具体取决于媒体类型注册表中的定义." (2认同)
  • 就其价值而言,`latin-1` 完全是错误的。根据 [RFC 4627 Section 3](https://tools.ietf.org/html/rfc4627#section-3),JSON 只能是 Unicode,而 [Section 6](https://tools.ietf.org/ html/rfc4627#section-6) 指定 MIME 类型为“application/json”,没有参数,可选或强制。 (2认同)

Mal*_*rks 5

首先,Accept标头可以接受参数,参见https://tools.ietf.org/html/rfc7231#section-5.3.2

所有text/*mime-types都可以接受charset参数.http://www.iana.org/assignments/media-types/media-types.xhtml#text

Accept-Charset标头允许用户代理指定它支持的字符集.

如果Accept-Charset标头不存在,则用户代理必须为其接受的每个 text/*媒体类型指定每个 charset参数,例如

Accept: text/html;charset=US-ASCII, text/html;charset=UTF-8, text/plain;charset=US-ASCII, text/plain;charset=UTF-8


Mar*_*tin 5

RFC 7231 第 5.3.2 ( Accept)节明确指出:

\n
\n

每个媒体范围后面可能跟着零个或多个适用的媒体\n类型参数(例如字符集)

\n
\n

因此,每个内容类型都允许使用字符集参数。理论上,客户可以接受,例如,text/html仅在UTF-8text/plain仅在US-ASCII

\n

Accept-Charset但在标头中声明可能的字符集通常更有意义,因为这适用于Accept标头中提到的所有类型。

\n

如果这些标头\xe2\x80\x99 字符集不\xe2\x80\x99t 重叠,服务器可以发送 status 406 Not Acceptable

\n

然而,由于各种原因,我不希望服务器提供花哨的交叉匹配。它会使服务器代码更加复杂(因此更容易出错),而实际上客户端很少会这样做此类请求。而且现在我希望服务器端的所有内容都使用 UTF-8 并按原样发送,因此\xe2\x80\x99s 没有什么可协商的。

\n


whi*_*mot 5

根据Mozilla Development Network 的说法,您永远不应该使用 Accept-Charset 标头。它已经过时了。