一文带你了解 HTTP 黑科技


一文带你了解 HTTP 黑科技

文章插图
 
这是 HTTP 系列的第三篇文章 , 此篇文章为 HTTP 的进阶文章 。
在前面两篇文章中我们讲述了 HTTP 的入门 , HTTP 所有常用标头的概述 , 这篇文章我们来聊一下 HTTP 的一些 黑科技 。
HTTP 内容协商什么是内容协商在 HTTP 中 , 内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制 。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉 , 然后提供给客户端最为适合的资源 。内容协商会以响应资源的语言、字符集、编码方式等作为判断的标准 。
一文带你了解 HTTP 黑科技

文章插图
 
内容协商的种类内容协商主要有以下3种类型:
  • 服务器驱动协商(Server-driven Negotiation)
这种协商方式是由服务器端进行内容协商 。服务器端会根据请求首部字段进行自动处理
  • 客户端驱动协商(Agent-driven Negotiation)
这种协商方式是由客户端来进行内容协商 。
  • 透明协商(Transparent Negotiation)
是服务器驱动和客户端驱动的结合体 , 是由服务器端和客户端各自进行内容协商的一种方法 。
内容协商的分类有很多种 , 主要的几种类型是 Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language 。
一般来说 , 客户端用 Accept 头告诉服务器希望接收什么样的数据 , 而服务器用 Content 头告诉客户端实际发送了什么样的数据 。
为什么需要内容协商我们为什么需要内容协商呢?在回答这个问题前我们先来看一下 TCP 和 HTTP 的不同 。
在 TCP / IP 协议栈里 , 传输数据基本上都是 header+body 的格式 。但 TCP、UDP 因为是传输层的协议 , 它们不会关心 body 数据是什么 , 只要把数据发送到对方就算是完成了任务 。
而 HTTP 协议则不同 , 它是应用层的协议 , 数据到达之后需要告诉应用程序这是什么数据 。当然不告诉应用这是哪种类型的数据 , 应用也可以通过不断尝试来判断 , 但这种方式无疑十分低效 , 而且有很大几率会检查不出来文件类型 。
所以鉴于此 , 浏览器和服务器需要就数据的传输达成一致 , 浏览器需要告诉服务器自己希望能够接收什么样的数据 , 需要什么样的压缩格式 , 什么语言 , 哪种字符集等;而服务器需要告诉客户端自己能够提供的服务是什么 。
所以我们就引出了内容协商的几种概念 , 下面依次来进行探讨
内容协商标头Accept接受请求 HTTP 标头会通告客户端自己能够接受的 MIME 类型
那么什么是 MIME 类型呢?在回答这个问题前你应该先了解一下什么是 MIME
MIME: MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准 。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据 。
也就是说 , MIME 类型其实就是一系列消息内容类型的集合 。那么 MIME 类型都有哪些呢?
文本文件: text/html、text/plain、text/css、Application/xhtml+xml、application/xml
图片文件: image/jpeg、image/gif、image/png
视频文件: video/mpeg、video/quicktime
应用程序二进制文件: application/octet-stream、application/zip
比如 , 如果浏览器不支持 PNG 图片的显示 , 那 Accept 就不指定image/png , 而指定可处理的 image/gif 和 image/jpeg 等图片类型 。
一般 MIME 类型也会和 q 这个属性一起使用 , q 是什么?q 表示的是权重 , 来看一个例子
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8这是什么意思呢?若想要给显示的媒体类型增加优先级 , 则使用 q= 来额外表示权重值 , 没有显示权重的时候默认值是1.0  , 我给你列个表格你就明白了
qMIME1.0text/html1.0application/xhtml+xml0.9application/xml0.8* / *
也就是说 , 这是一个放置顺序 , 权重高的在前 , 低的在后 , application/xml;q=0.9 是不可分割的整体 。
Accept-CharsetAccept-charset 属性规定服务器处理表单数据所接受的字符编码;Accept-charset 属性允许你指定一系列字符集 , 服务器必须支持这些字符集 , 从而得以正确解释表单中的数据 。


推荐阅读