HTTP指南
这是我参与「第四届青训营 」笔记创作活动的的第9天
1.重点内容
这节课主要了解HTTP相关的内容
2.重要的知识点
- 什么是HTTP?
- HTTP的协议发展
- HTTP结构
- Method
- HTTP状态码
- RESTful API
- 常见请求头
- 常见响应头
- 缓存
- cookie
3.详尽的知识点
什么是HTTP?
- HTTP(Hyper Text Transfer Protocol)是一种超文本传输协议
- 应用层协议,基于TCP协议
- 分为请求和响应两部分
- 简单可扩展
- 无状态,请求之间是孤立的
HTTP的协议发展
-
HTTP/0.9
- 请求GET
- 响应只有HTML文档
-
HTTP/1.0
- 增加了Header
- 添加了状态码
- 支持多种文档类型
-
HTTP/1.1
- 链接复用
- 添加缓存
- 内容协商
-
HTTP/2
- 二进制协议
- 压缩Header
- 服务器推送
-
HTTP/3
HTTP结构
Request结构
POST / HTTP/1.1
Host: Localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
...
-123u3io113
(more data)
Response结构
HTTP/1.1 403 Forbidden
Server: Apache
Content-Type: text/html;charset=iso-8859-1
Date: Wed;10 Aug 2016 09:23:25 GMT
Keep-Alive: timeout=5, max=1000
Connection:Keep-Alive
...
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
(more data)
可以看出Request和Response都由start line,HTTP headers,empty line,body组成
Method
| Method | 作用 |
|---|---|
| GET | 请求一个指定资源的表示形式,获取数据 |
| POST | 将实体提交到指定的资源 |
| PUT | 替换目标资源所以当前状态 |
| DELETE | 删除指定的资源 |
| HEAD | 请求一个与GET请求的响应相同的响应,没有响应体 |
| CONNECT | 建立一个到目标资源服务器的隧道 |
| OPTIONS | 用于描述资源的通信选项 |
| TRACE | 沿着路径进行消息回环测试 |
| PATCH | 对资源应用的部分修改 |
请求的特点
-
Safe
- 不会修改服务器的数据
- GET HEAD OPTIONS
-
Idempotent
- 同样的请求一次和多次效果,服务器状态都一样
- 所以safe方法都是idempotent的
- GET HEAD OPTIONS PUT DELETE
HTTP状态码
| 状态码 | 信息 |
|---|---|
| 1xx | 请求以接收,继续处理 |
| 2xx | 请求已被成功接收 |
| 3xx | 重定向,需要进一布操作 |
| 4xx | 客户端错误 |
| 5xx | 服务器端错误 |
常见状态码
- 200 OK
- 301 永久转移
- 302 临时跳转
- 401 未授权
- 404 请求资源不存在
- 500 服务器内部发生错误
- 504 Gateway Timeout
RESTful API
- 每一个URL都代表一种资源
- 客户端和服务器之间,传递这种资源的某种表现层
- 客户端通过HTTP method,对服务器资源进行操作,实现"表现层状态转化"
常见请求头
| 请求头 | 信息 |
|---|---|
| Accept | 接收类型,表示浏览器支持的MIME类型 |
| Content-type | 客户端发送出去的实体内容的类型 |
| Cache-Control | 指定请求和响应遵循的缓存机制 |
| If-Modified-Since | 对应服务器端的Last-Modified查看文件是否变动 |
| Expires | 缓存控制,不会请求,直接使用缓存 |
| Max-age | 表示资源再本地缓存多少秒,不会请求,直接使用缓存 |
| If-None-Match | 对应服务器端的ETag,匹配内容是否改变 |
| Cookies | 有cookie且同域时会自动带上 |
| Referer | 该页面的来源URL |
| Origin | 最初的请求发起者 |
| User-Agent | 用户客户端的必要信息 |
常见响应头
| 请求头 | 信息 |
|---|---|
| Content-type | 服务器返回实体内容的类型 |
| Cache-Control | 指定请求和响应遵循的缓存机制 |
| Last-Modified | 请求资源的最后修改时间 |
| Expires | 判断什么时候过期,不再缓存 |
| Max-age | 本地资源应该缓存多少秒 |
| ETag | 特定版本标识符 |
| Set-Cookies | 设置页面关联的cookies |
| Server | 服务器相关信息 |
| Access-Control-Allow-Origin | 允许的请求Origin头部 |
缓存
- 强缓存
- 协商缓存
Cookie
| Set-Cookie | 信息 | ||
|---|---|---|---|
| Name=value | 各种cookie的名称和值 | ||
| Exprires=date | cookie的有效期 | ||
| Path=path | 限制cookie的发送范围的文件目录 | ||
| Domain=domain | 限制cookie生效的域名 | ||
| secure | 仅在HTTPS安全链接时,才发送cookie | ||
| HttpOnly | JavaScript脚本无法获得cookie | ||
| SameSite=[None | Strict | Lax] | None 同站、跨站请求都可发送 Strict 仅在同站发送 Lax 允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送 |
4.课后总结
HTTP协议作为不管是用户还是开发人员都日常接触到的协议,应该多了解其底层原理,为将来HTTP3的发展做出自己的贡献。