HTTP 的定义:
一种⽹网络传输协议,位于 TCP / IP 协议族的最顶层——应⽤用层、
HTTP (Hypertext Transfer Protocol) 即超文本传输协议,和 HTML (Hypertext Markup Language) 超文本标记语⾔一起诞⽣,用于在⽹络上请求和传输 HTML 内容。
超⽂文本,即「扩展型⽂文本」,指的是 HTML 中可以有链向别的⽂文本的链接(hyperlink)。
以上定义中 Hyper 有拓展的一层意思,互联网创始之初,人们就在思考如何更加方便的在互联网传输信息,最初这些信息都是以文本形式进行传输,随着互联网信息越积约多,就急需一种让文件之间互相关联起来的方式来提高信息查找效率,于是 HTML 这种在文本文件中可以指向别的文本的语言(Hypertext Markup Language 超文本标记语言)就诞生了,随后用户传输这种文本的协议也诞生了也就是 HTTP 协议。
HTTP 工作方式:
- 客户端按需求组装 HTTP 报文,
- 发送给服务器,
- 服务器处理后得到响应报文,
- 发回给客户端,
- 客户端处理响应报文
浏览器器:
⽤用户输⼊入地址后回⻋车或点击链接 -> 浏览器器拼装 HTTP 报⽂文并发送请求给服务器器 -> 服务器器处理理请求后
发送响应报⽂文给浏览器器 -> 浏览器器解析响应报⽂文并使⽤用渲染引擎显示到界⾯面
手机 App:
⽤用户点击或界⾯面⾃自动触发联⽹网需求 -> Android 代码调⽤用拼装 HTTP 报⽂文并发送请求到服务器器 -> 服务
器器处理理请求后发送响应报⽂文给⼿手机 -> Android 代码处理理响应报⽂文并作出相应处理理(如储存数据、加⼯工
数据、显示数据到界⾯面)
URL和HTTP 报文
URL 格式:
三部分:协议类型、服务器器地址(和端⼝口号)、路路径(Path)
协议类型://服务器器地址[:端⼝口号]路路径
http://hencoder.com/users?gender=male
报文格式:
请求报文:
响应报文:
HTTP Request
- Request Line
- method :请求方法
- path:用来定位
- HTTP version
- Request Headers
- Request Body
HTTP Response
- Status Line
- HTTP version
- status code
- status message
- Response Headers
- Response Body
请求响应关键内容
- Request method
- Response status code
- Headers
- Body
Request Method
Status Code
作用:对请求的结果做类型化描述(如「获取成功」「内容未找到」)
Header
HTTP消息的元数据(metadata)——> metadata是数据的属性:数据的格式,数据的长度等
- Host : 服务器主机地址。
- 注意:不是在网络上⽤于寻址的,而是在目标服务器上用于定位子服务器的。
- Host 服务器的主机地址--域名,Host:api.gitbhub.com,但不是用来寻址的,DNS进行寻址
- 在浏览器封装好报文之后,发出请求之前使用DNS寻址。寻址是IP层的做的事情。
- Host 的作用是:当一个主机有多个虚拟主机的时候,用来识别这个请求是发给哪个虚拟主机。
- Content-Length
- 内容的长度 (字节)
- 用途:二进制数据无法使用特殊符号来结束内容,因为可能这个特殊符号可能出现在内容中间。
- Content-Type类型
-
- text/html
- application/x-www-form-urlencoded
- 普通表单
- encoded URL 格式
- body格式 :name=rengwuxian&gender=male
- 不同于multipart的是传输的是文本形式。
- multipart/form-data:
- 用来传带文件的表单。
- 客户端和服务端都认为传输的是二进制内容
- boundary 用来分界,分界你的Header和Body以及body的各个属性
- 可以传多部分内容,带有分界线。 最后一个的右边边多两个横杠,表示结束。
- 只传一个文件,不传任何东西,也可以用multitype传。
- application/json;
- json形式,用于 Web Api 的响应或 POST / PUT 请求
- 形式比较自由,请求(用json提交数据)和响应都比较常见
- image/jpeg
- application/gzip
- Location:重定向的目标 URL
- User-Agent:用户代理,就是我们的客户端、,浏览器。
-
- 用户请求网络是通过浏览器,或者手机客户端请求的,那么浏览器和手机客户端就是用户代理。
- 为什么浏览器的User-Agent都是mozilla? 几十年前,浏览器大战的时候。网页需要给不同的浏览器做适配。最后开发者都只适配Netscape(网景)公司的浏览器(mozilla)。后来IE等都把自己的User-Agent改为mozilla.
- Range/Accept-Ranges:目标服务器支持分段取内容时,指定Body内容的范围。
- 用途1:断点续传
- 用途2:分段下载,用于多线程下载,提升效率
按范围取数据
Accept-Range: bytes 响应报文中出现,表示服务器支持按字节来取范围数据
Range: bytes=<start>-<end> 请求报文中出现,表示要取哪段数据
Content-Range:<start>-<end>/total 响应报文中出现,表示发送的是哪段数据
- Cookie/Set-Cookie:发送/设置 Cookie
- Authorization:授权信息
部分其他 Header
- Accept: 客户端能接受的数据类型。如 text/html
- Accept-Charset: 客户端接受的字符集。如 utf-8
- Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
- Content-Encoding:压缩类型。如 gzip
Cache
作用:在客户端或中间网络节点缓存数据,降低从服务器取数据的频率,以提高网络性能。
- Cache (缓存) 和 Buffer (缓冲) 的区别
- Cache是这会创建完了之后,等会可能还需要用,暂时存储起来,过会再用。例如LRUCache
- Buffer是生产消费上下游的关系,针对工作流。
- 麦当劳在下班高峰之前做很多食品,做缓冲。
- 路由器,一瞬间收到1M,先发500k,再发500k
- 视频流,网速快的时候,先加载一些。
- Cache-Control:no-cache、no-store、max-age
- no-cache 告诉客户端,可以缓存,但是再次使用资源的时候,需要询问服务端失效了没有。
- no-store 不允许缓存。
- max-age 失效日期之前不用询问
- Last-Modified:
- 询问服务器,在指定时间之后改过没有
- if-Modified-Since,是否在某时改动过
- Etag
- 相当于一个hash,指纹。你可以根据指纹判断是否改变。
- If-None-Match,你的最新的资源还是这个标签吗,是的话则不用再给我返回新的了。
- Cache-Control:private/public
- 告诉中间节点(例如网关)是否需要做缓存
Chunked Transfer Encoding
用于服务端需要返回比较大的信息时,分段返回
- Transfer-Encoding: chunked
- 表示 Body 长度无法确定,Content-Length 不能使用,不知道要传给客户端多长,但是知道什么时候结束
- Body 格式:
<length1>
<data1>
<length2>
<data2>
0
(最后传输 0 表示内容结束)0 加 换行
实例:前面有一些数据,边传输,边解析,直到遇到0,表示传输结束。
REST
什么是 REST:an architectural style that defines a set of constraints and properties based on HTTP
对HTTP进行了一系列的限制的架构风格,是对整个系统的要求
- Server-Client architecture CS架构
- Statelessness 无状态:
- 除了客户端提供的信息之外,没有任何额外的信息来进行身份的判断
- 前后没有关联
- Cacheability 可缓存,需要整个网络结构的配合,是整个的架构
- Layered system 分层的系统,要求对客户端透明,客户端不需要知道服务端架构。
- Code on demand 服务器返回信息允许包括一些可执行代码
- javascript
- java Applet
- Uniform interface
- Resource identification in requests
- Resource manipulation through representations
- Self-descriptive messages
- Hypermedia as the engine of application state (HATEOAS)
RESTful HTTP
- 正确使用HTTP