HTTP 报文格式
HTTP 报文由请求行、首部、实体组成,首部和实体之间由 CRLF(回车换行符) 分隔开。
请求报文格式:
<method> <request-URL> <version>
<headers>
<entity-body>
- 请求方法、请求 URL、协议版本
GET /2.app.js HTTP/1.1
Host: 118.190.217.8:3389
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Accept: *\/*
Referer: http://118.190.217.8:3389/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
响应报文格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
- 协议版本、状态码、原因短语(如200跟上OK)
HTTP/1.1 200 OK
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Sat, 07 Mar 2020 03:52:30 GMT
ETag: W/"253e-170b31f7de7"
Content-Type: application/javascript; charset=UTF-8
Vary: Accept-Encoding
Content-Encoding: gzip
Date: Fri, 15 May 2020 05:38:05 GMT
Connection: keep-alive
Transfer-Encoding: chunked
幂等和非幂等
- 幂等:果一个请求不管执行多少次,其执行的副作用都是一样的,这个请求就是幂等的(如:get、head)
- 非幂等:post(如相同url都是执行新增的操作)
请求方法
-
HEAD:只从服务器获取文档的头部不获取资源
-
PUT:PUT 方法的语义就是让服务器用请求的主体部分来创建一个由所请求的 URL 命名的新文档。 如果那个文档已存在,就覆盖它
-
POST:通常用来向服务器发送表单数据。
-
TRACE:客户端发起一个请求时,这个请求可能要穿过路由器、防火墙、代理、网关等。每个中间节点都可能会修改原始的 HTTP 请求,TRACE 方法允许客户端在最终发起请求时,看看它变成了什么样子。
- TRACE 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。 这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否被毁坏或修改过。
- OPTIONS: 预检测,请求 Web 服务器告知其支持的各种功能
- DELETE: 让服务器删除请求 URL 所指定的资源。
首部报文
通用报文:
- Connection:允许客户端和服务器指定与请求/响应连接有关的选项
- Date:提供日期和时间标志,说明报文是什么时间创建的
- MIME-version:给出了发送端使用的MIME版本
- Trailer:如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合
- Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
- Update:给出了发送端可能想要“升级”使用的新版本或协议
- via:显示了报文经过的中间节点(代理、网关)
请求报文:
- client-IPR:提供了运行客户端的机器的IP地址
- From:提供了客户端用户的E-mail地址
- Host:给出了接收请求的服务器的主机名和端口号
- Referer:提供了包含当前请求URI的文档的URL
- User-Agent:将发起请求的应用程序名称告知服务器
- UA-Color:提供了与客户端显示器的显示颜色有关的信息
- UA-CPU:给出了客户端CPU的类型或制造商
- UA-Disp:提供了与客户端显示器(屏幕)能力有关的信息
- UA-OS:给出了运行在客户端机器上的操作系统名称及版本
- UA-Pixels:提供了客户端显示器的像素信息
响应报文:
实体首部报文:
- ETag:与此实体相关的实体标记
- Expires:实体不再有效,要从原始的源端再次获取此实体的日期和时间
- Last-Modified:这个实体最后一次被修改的日期和时间