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
标题.
首先,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
RFC 7231 第 5.3.2 ( Accept
)节明确指出:
\n\n每个媒体范围后面可能跟着零个或多个适用的媒体\n类型参数(例如字符集)
\n
因此,每个内容类型都允许使用字符集参数。理论上,客户可以接受,例如,text/html
仅在UTF-8
且text/plain
仅在US-ASCII
。
Accept-Charset
但在标头中声明可能的字符集通常更有意义,因为这适用于Accept
标头中提到的所有类型。
如果这些标头\xe2\x80\x99 字符集不\xe2\x80\x99t 重叠,服务器可以发送 status 406 Not Acceptable
。
然而,由于各种原因,我不希望服务器提供花哨的交叉匹配。它会使服务器代码更加复杂(因此更容易出错),而实际上客户端很少会这样做此类请求。而且现在我希望服务器端的所有内容都使用 UTF-8 并按原样发送,因此\xe2\x80\x99s 没有什么可协商的。
\n 归档时间: |
|
查看次数: |
34335 次 |
最近记录: |