- 报文(Message): HTTP通信的基本单位,分为请求报文和响应报文。报文包括报文首部和报文主体。
- 报文首部: 包含了请求或响应的元信息,如Host、User-Agent、Content-Type等。首部可以分为通用首部、请求首部、响应首部和实体首部。
常见字段:
- Host :客户端发送请求时,用来指定服务器的域名。
- Content-Length:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。(“粘包”)
- Connection:字段最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用(HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。)
(不要把 HTTP Keep-Alive 和 TCP Keepalive 搞混)- Content-Type:用于服务器回应时,告诉客户端,本次数据是什么格式。
- Cookie: 由服务器发送给客户端,存储在客户端本地的一小段文本信息。用于跟踪用户的状态,常用于实现用户登录状态的保持。
-
请求报文(Request): 客户端向服务器发送的消息,用于请求某种操作。请求由请求行、请求头和请求体组成。请求行包括请求方法、请求的URL和HTTP协议版本。
- 请求方法: 定义了对资源执行的操作,常见的有GET、POST、PUT、DELETE等。每个方法对应一种特定的操作。
- GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。
- POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。
GET 和 POST 方法都是安全和幂等的吗?
安全:指请求方法不会「破坏」服务器上的资源。
幂等:多次执行相同的操作,结果都是「相同」的。
- *GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。*所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
- *POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。*所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
5. 响应报文(Response): 服务器向客户端返回的消息,用于响应客户端的请求。响应由状态行、响应头和响应体组成。状态行包括响应的状态码和对应的状态消息。
-
状态码: 用于表示服务器对请求的处理结果。常见的状态码包括200(OK,请求成功)、404(Not Found,资源未找到)、500(Internal Server Error,服务器内部错误)等。
- HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。