HTTP 内容协商 (Content negotiation)
本文涉及
-
URI、URL、
-
HTTP标头 Accept 、Content-Type
-
状态码:300、406、415
知识剖析
-
HTTP (HyperText Transfer Protocol)
- 超文本传输协议 -- 用于浏览器与服务器之间的通信 , 客户端打开一个连接以发出请求,然后等待······直到收到服务器端响应。
-
内容
- 资源文件
-
协商
- 客户端与服务器之间 也就是http通信时
(有感情经验的看这个) 女朋友提出今晚想吃水煮鱼片or酸菜鱼,而我需要根据家里材料的情况等,回复她到底吃哪个。
在 HTTP 协议中,内容协商是一种机制,用于为同一 URI 提供资源不同的表示形式,以帮助用户代理指定最适合用户的表示形式(例如,哪种文档语言、哪种图片格式或者哪种内容编码)。
问题
一张图片,为了支持不同的客户端,会有多种格式
解决问题
内容协商--解决此类问题的机制: 客户端在发送的请求中的附带标头信息,声明了它想要的文件形式;而服务器接受信息,用算法处理信息,响应请求,返回结果。
结果有成功与失败
- 406(Not Acceptable)、415(Unsupported Media Type)表示服务器不能提供客户端需要的
文件形式 - 300(Multiple Choices)
文件形式(格式)
-
文件即资源
-
资源 被 URI 表示
- 只要是能唯一标识资源的字符串就叫URI (Uniform Resource Identifier)
-
资源 通过URL具体定位,即可以通过URL访问资源 (Uniform Resource Locator)
-
URL是URI的子集,必须是能够定位到资源位置的字符串才是URL,也可以说只要是能定位到资源的就叫URL,所以可以有多个URL指向同一资源,这就是多种格式。
Accept
- HTTP 请求头
- 用来告知(服务器)客户端可以处理的内容类型
Accept: text/html
Accept: image/*
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
Content-Type
- HTTP 响应头
- 用来告诉(客户端)服务器实际返回的内容类型
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
(也可做请求头)在HTML表单中 , 请求头的 Content-Type 由元素上的 enctype 属性指定
<form action="/" method="post" enctype="multipart/form-data">
<input type="text" name="description" value="some text">
<input type="file" name="myFile">
<button type="submit">Submit</button>
</form>
<-->请求头看起来像这样</-->
POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"
some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain
(content of the uploaded file foo.txt)
---------------------------974767299852498929531610575