HenCoder Plus L01——HTTP 的概念、原理、工作机制、数据格式和 REST
课程的定位
-
讲的内容是大家都要用到的基础的东西,但是并不是特别清楚的东西。
-
例如
- 状态码能说清楚的人也不多。
- okio 这个库也非常重要。很多人都忽略了。
HyperText Transfer Protocol
-
现状
-
你不知道https为什么是安全的,你怎么保证你写的https是安全的呢?很多东西都是默认的你觉得没问题,一旦修改配置项,你就不会做了。
-
一次配置,终身使用。所以不需要了解太多。
-
什么是连接呢?很多人什么是连接都不知道。
-
-
hyper 指的是扩展的意思,而不是超级的意思。
-
超文本:即「扩展型文本」,指的是 HTML 中可以有链向别的文本的链接(hyperlink)。
-
HTTP 和 HTML 这两个东西是一起诞生的
URL——>HTTP 报文
HTTP 工作方式:
- 客户端按需求组装 HTTP 报文,
- 发送给服务器,
- 服务器处理后得到响应报文,
- 发回给客户端,
- 客户端处理响应报文
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
- GET
- 获取资源:没有Body(规范)
- POST
- 增加或修改资源:有Body
- PUT
- 只修改资源:有Body
- 和POST的区别是只有修改资源
- PUT是幂等的,POST不是幂等的(修改是幂等的,增加不是幂等的)
幂等 : 执行多次和执行一次的结果是一样的
- DELETE
- 删除资源:没有Body
- 也是幂等的,把1号用户删掉1次和删掉10次结果是一样的。
- HEAD
- 和GET相似,返回的响应中没有Body
- 场景:做下载的时候,先HEAD一下(获取断点下载,文件大小),再下载。
Status Code
作用:对请求的结果做类型化描述(如「获取成功」「内容未找到」)
- 1xx :临时性消息
- 具有兼容性的请求,服务器告诉客户端可以切换到hTTP2
- 客户端向服务端传东西的时候,传的比较大,多次传输合成一个文件
- 2xx :成功
- 201 新建成功
- 3xx :重定向
- 客户端主动再做一次请求
- 301 永久性迁移
- 304 表示内容没有改变
- 4xx :客户端错误
- 401
- 5xx : 服务器错误
Header
HTTP消息的元数据(metadata)——> metadata是数据的属性:数据的格式,数据的长度等
- Host : 服务器主机地址
- Host 请求头不是用来寻址的
- 在浏览器封装好报文之后,发出请求之前使用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 请求
- 形式比较自由
- image/jpeg
- application/gzip
- Location:重定向的目标 URL
- User-Agent:用户代理。
- 用户请求网络是通过浏览器,或者手机客户端请求的,那么浏览器和手机客户端就是用户代理。
- 为什么浏览器的User-Agent都是mozilla? 几十年前,浏览器大战的时候。网页需要给不同的浏览器做适配。最后开发者都只适配Netscape(网景)公司的浏览器(mozilla)。后来IE等都把自己的User-Agent改为mozilla.
- Range/Accept-Ranges;指定Body内容的范围
- Cookie/Set-Cookie:发送/设置 Cookie
- Authorization:授权信息
部分其他 Header
- Accept: 客户端能接受的数据类型。如 text/html
- Accept-Charset: 客户端接受的字符集。如 utf-8
- Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
- Content-Encoding:压缩类型。如 gzip
Cache
-
Cache (缓存) 和 Buffer (缓冲) 的区别
- Buffer是生产消费上下游的关系,针对工作流。
- 麦当劳在下班高峰之前做很多食品,做缓冲。
- 路由器,一瞬间收到1M,先发500k,再发500k
- 视频流,网速快的时候,先加载一些。
- Buffer是生产消费上下游的关系,针对工作流。
- Cache-Control:no-cache、no-store、max-age
- no-cache 告诉客户端,可以缓存,但是再次使用资源的时候,需要询问服务端失效了没有。
- no-store 不允许缓存。
- max-age 失效日期之前不用询问
- Last-Modified:
- 在指定时间之后改过没有
- if-Modified-Since
- Etag
- 相当于一个hash,指纹。你可以根据指纹判断是否改变。
- Cache-Control:private/public
- 告诉中间节点(例如网关)是否需要做缓存
Chunked Transfer Encoding
用于服务端需要返回比较大的信息时,分段返回
- Transfer-Encoding: chunked
- 表示 Body 长度无法确定,Content-Length 不能使用
- Body 格式:
<length1>
<data1>
<length2>
<data2>
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