???? HTTP 请求
- 首行: [方法] + [uri] + [版本]
- Header: 请求报头, 冒号分割的键值对; 每组属性之间使用
\r\n
分隔; 遇到空行表示 Header 部分结束- Body: 空行后面的内容都是 Body. Body 允许为空字符串.
如果 Body 存在, 则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度
;
???? HTTP 响应
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 响应报头, 冒号分割的键值对;每组属性之间使用 \r\n 分隔;遇到空行表示 Header 部分结束
- Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.
???? HTTP 的方法
???? 其中最常用的就是 GET 方法和 POST 方法.
- GET 方法(重点)
- 用途: 用于请求 URL 指定的资源。
- 示例: GET /index.html HTTP/1.1
- 特性: 指定资源经服务器端解析后返回响应内容。
- form 表单: https://www.runoob.com/html/html-forms.html
- POST 方法(重点)
- 用途: 用于传输实体的主体, 通常用于提交表单数据。
- 示例: POST /submit.cgi HTTP/1.1
- 特性: 可以发送大量的数据给服务器, 并且数据包含在请求体中。
- form 表单: https://www.runoob.com/html/html-forms.htm
- PUT 方法(不常用)
- 用途: 用于传输文件, 将请求报文主体中的文件保存到请求 URL 指定的位置。
- 示例: PUT /example.html HTTP/1.1
- 特性: 不太常用, 但在某些情况下, 如 RESTful API 中, 用于更新资源。
- HEAD 方法
- 用途: 与 GET 方法类似, 但不返回报文主体部分, 仅返回响应头。
- 示例: HEAD /index.html HTTP/1.1
- 特性: 用于确认 URL 的有效性及资源更新的日期时间等。
- DELETE 方法(不常用)
- 用途: 用于删除文件, 是 PUT 的相反方法。
- 示例: DELETE /example.html HTTP/1.1
- 特性: 按请求 URL 删除指定的资源。
- OPTIONS 方法
- 用途: 用于查询针对请求 URL 指定的资源支持的方法。
- 示例: OPTIONS * HTTP/1.1
- 特性: 返回允许的方法, 如 GET、 POST 等。
???? HTTP 的状态码
???? 最常见的状态码, 比如 200(OK)
, 404(Not Found)
, 403(Forbidden)
, 302(Redirect, 重定向)
, 504(Bad Gateway)
状态码 | 含义 | 应用样例 |
---|---|---|
100 | Continue | 上传大文件时, 服务器告诉客户端可以继续上传 |
200 | OK | 访问网站首页, 服务器返回网页内容 |
201 | Created | 发布新文章, 服务器返回文章创建成功的信息 |
204 | No Content | 删除文章后, 服务器返回“无内容”表示操作成功 |
301 | Moved Permanently | 网站换域名后, 自动跳转到新域名; 搜索引擎更新网站链接时使用 |
302 | Found 或 See Other | 用户登录成功后, 重定向到用户首页 |
304 | Not Modified | 浏览器缓存机制, 对未修改的资源返回304 状态码 |
400 | Bad Request | 填写表单时, 格式不正确导致提交失败 |
401 | Unauthorized | 访问需要登录的页面时, 未登录或认证失败 |
403 | Forbidden | 尝试访问你没有权限查看的页面 |
404 | Not Found | 访问不存在的网页链接 |
500 | Internal Server Error | 服务器崩溃或数据库错误导致页面无法加载 |
502 | Bad Gateway | 使用代理服务器时, 代理服务器无法从上游服务器获取有效响应 |
503 | Service Unavailable | 服务器维护或过载, 暂时无法处理请求 |
???? 以下是仅包含重定向相关状态码的表格
状态码 | 含义 | 是否为临时重定向 | 应用样例 |
---|---|---|---|
301 | Moved Permanently | 否(永久重定向) | 网站换域名后, 自动跳转到新域名;搜索引擎更新网站链接时使用 |
302 | Found 或 See Other | 是(临时重定向) | 用户登录成功后,重定向到用户首页 |
307 | Temporary Redirect | 是(临时重定向) | 临时重定向资源到新的位置(较少使用) |
308 | Permanent Redirect | 否(永久重定向) | 永久重定向资源到新的位置(较少使用) |
关于重定向的验证, 以 301 为代表:
HTTP 状态码 301(永久重定向) 和 302(临时重定向) 都依赖 Location 选项。 以下是关于两者依赖 Location 选项的详细说明:
HTTP 状态码 301(永久重定向) :
- 当服务器返回 HTTP 301 状态码时, 表示请求的资源已经被永久移动到新的位置。
- 在这种情况下, 服务器会在响应中添加一个 Location 头部, 用于指定资源的新位置。 这个 Location 头部包含了新的 URL 地址, 浏览器会自动重定向到该地址。
- 例如, 在 HTTP 响应中, 可能会看到类似于以下的头部信息:
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n
HTTP 状态码 302(临时重定向) :
- 当服务器返回 HTTP 302 状态码时, 表示请求的资源临时被移动到新的位置。
- 同样地, 服务器也会在响应中添加一个 Location 头部来指定资源的新位置。 浏览器会暂时使用新的 URL 进行后续的请求,
但不会缓存这个重定向。
- 例如, 在 HTTP 响应中, 可能会看到类似于以下的头部信息:
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n
???? 总结: 无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。
???? HTTP 常见 Header
- Content-Type: 数据类型(text/html 等)
- Content-Length: Body 的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
???? 关于 connection 报头
???????? HTTP 中的 Connection 字段是 HTTP 报文头的一部分, 它主要用于控制和管理客户端与服务器之间的连接状态
核心作用
-
管理持久连接
: Connection 字段还用于管理持久连接(也称为长连接) 。 持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接, 以便在同一个连接上发送多个请求和接收多个响应。
持久连接(长连接)
-
HTTP/1.1
: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接。 -
HTTP/1.0
: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0 上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。
语法格式
Connection: keep-alive
: 表示希望保持连接以复用 TCP 连接。Connection: close
: 表示请求/响应完成后, 应该关闭 TCP 连接
???????? 下面附上一张关于 HTTP 常见 header 的表格
字段名 | 含义 | 样例 |
---|---|---|
Accept | 客户端可接受的响应内容类型 | Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 |
AcceptEncoding | 客户端支持的数据压缩格式 | Accept-Encoding: gzip, deflate, br |
AcceptLanguage | 客户端可接受的语言类型 | Accept-Language: zhCN,zh;q=0.9,en;q=0.8 |
Host | 请求的主机名和端口号 | Host: www.example.com:8080 |
User-Agent | 客户端的软件环境信息 | User-Agent: Mozilla/5.0 (Windows NT10.0; Win64; x64)AppleWebKit/537.36 (KHTML, likeGecko) Chrome/91.0.4472.124Safari/537.36 |
Cookie | 客户端发送给服务器的 HTTP cookie 信息 | Cookie: session_id=abcdefg12345;user_id=123 |
Referer | 请求的来源 URL | Referer: http://www.example.com/previous_page.html |
Content-Type | 实体主体的媒体类型 | Content-Type: application/x-wwwform-urlencoded (对于表单提交) 或Content-Type: application/json (对于JSON 数据) |
Content-Length | 实体主体的字节大小 | Content-Length: 150 |
Authorization | 认证信息, 如用户名和密码 | Authorization: BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ== (Base64编码后的用户名:密码) |
Cache-Control | 缓存控制指令 | 请求时: Cache-Control: no-cache 或Cache-Control: max-age=3600; 响应时:Cache-Control: public, maxage=3600 |
Connection | 请求完后是关闭还是保持连接 | Connection: keep-alive 或Connection: close |
Date | 请求或响应的日期和时间 | Date: Wed, 21 Oct 2023 07:28:00 GMT |
Location | 重定向的目标URL(与 3xx 状态码配合使用) | Location:http://www.example.com/new_location.html (与 302 状态码配合使用) |
Server | 服务器类型 | Server: Apache/2.4.41 (Unix)Last-Modified 资源的最后修改时间Last-Modified: Wed, 21 Oct 202307:20:00 GMT |
ETag | 资源的唯一标识符, 用于缓存 | ETag: “3f80f-1b6-5f4e2512a4100” |
Expires | 响应过期的日期和时间 | Expires: Wed, 21 Oct 2023 08:28:00 GMT |