# HTTP 介绍
# 是什么
超文本传输协议,Hyper Text Transfer Protocol。从服务器传输超文本标记语言(HTML)到本地浏览器的协议。在服务器和客户端之间传输文本、音频、图片等内容的约定和规范。
- 超文本:超越普通文本。文本、图片、音频、视频等内容。
- 传输:将内容/数据从一方传到另一方。说明 HTTP 是双向的协议,双方数据的传输过程,可能经过多个中间人(其中就包含了安全认证,数据压缩,编码转换)。不能用于广播、寻址。
- 协议:双方/多方之间的一个约定,在 HTTP 中,规定了计算机之间的通信规范,以及各种控制和错误处理方式。
# 原理
HTTP 需要与其他协议协作(不是单独存在的),一个基于 TCP/IP 通信协议来传递数据的协议,可传输数据包括 HTML 文件、图片、音频等,属于应用层,一般用于 B/S
架构。
TIP
应用层还有其他协议:
FTP:文件传输协议,用来在客户机和 FTP 服务器之间的传输数据(用来在两台计算机之间传输文件)
DNS 域名系统:域名到 IP 之间的解析服务
SMTP:邮件发送协议
POP3:邮件接收协议
DHCP:动态主机配置协议
# 特点
请求 - 应答
支持客户端/服务端模式,也是一种请求/响应模式的协议。简单快速
发送请求时,只需传输请求方法和路径就可以,常见方法 GET、POST、OPTIONS、HEAD灵活可拓展
允许传输多种类型的数据,例如文本、图片、音频等,传输类型通过 Content-Type 标记无状态
每次请求不保存之前发送请求的状态,每次都是独立的,Cookie。可靠传输
依赖于 TCP/IP 协议,确保传输数据的完整性。持久连接
需要配置 Connection: keep-alive(HTTP/1.1 默认开启)。建立一次 TCP 请求,可多次请求/响应。出现原因,每进行一次 HTTP 请求,都会进行一次 TCP 连接,连接和开销较大,耗时。
# 优点
- 简单、灵活、易拓展
- 应用广泛、环境成熟
- 无状态,服务器不用记录状态信息,减轻服务器压力。
# 缺点
- 明文传输。使用文本,非二进制数据
- 无法验证报文完整性。内容可能被篡改
- 不验证通信方的身份,可能会被伪造
- 无状态
- 队头阻塞
# 请求方法
- GET:获取资源,幂等操作
- HEAD:获取报文首部,类似于 GET,但是不返回报文主体,幂等操作
- POST:更新/创建资源,非幂等操作
- PUT:更新/创建资源,幂等操作
- PATCH: 内容局部更新,幂等操作
- DELETE:删除资源/数据,幂等操作
- OPTIONS:插叙服务器支持的方法,是否跨域,幂等操作
TIP
幂等,多次操作,返回的结果是一致的。 PUT
# GET、POST 区别
- GET 会被浏览器缓存下来,POST 不会
- GET 只能进行 URL 编码,只能接收 ASCII 字符,POST 没限制
- GET 参数方法在 URL 上,POST 放到请求里
- 幂等性
TIP
URL 和 URI 的区别
URI:Uniform Resource Identifier 统一资源标识符,只能使用 ASCII 码。
URL:Uniform Resource Location 统一资源定位符
URI 是用来标示 一个具体的资源的,我们可以通过 URI 知道一个资源是什么。组成:协议,主机地址(域名或 IP),端口,路径,query 参数等。
URL 则是用来定位具体的资源的,标示了一个具体的资源位置。互联网上的每个文件都有一个唯一的 URL。
URN 统一资源名,是 URI 的另一种形式。特定内容的唯一名称,与资源位置无关。仍处于研发阶段。
# 报文
# 请求
# 请求行
请求行包括,请求方法、URL、协议/版本
# 请求头
- connective:
- Origin:
- User-Agent:
- Accept-Encoding: ...
# 请求正文
# 响应
# 响应行
响应行包括,协议/版本,响应状态
# 响应头
- Date:
- Set-Cookie:
- Cache-Control:
- Expires:
- Etag:
- Last-Modified:
- 响应正文
TIP
Set-Cookie: a=b;Max-Age=10;Expires=xxx;Domain=xxx;path=/;HttpOnly;SameSite=Strict
Expires(绝对时间点),Max-Age(单位是秒)用来设置 cookie 的过期时间,Max-Age 优先级更高。
Domain
和Path
指定了 Cookie 所属的域名和路径
HttpOnly
设置了不能通过 document.cookie 操作 cookie 信息。
SameSite
可以防范跨站请求伪造
(XSRF)攻击,设置成SameSite=Strict
可以严格限定 Cookie 不能随着跳转链接跨站发送,而SameSite=Lax
则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。SameSite=Secure
,Cookie 只能用 HTTPS 发送。
# 状态码
# 1xx,请求已收到,需进一步处理
# 2xx,成功状态
- 200 OK,成功返回,带有响应体
- 204 No Content,成功返回,不带实体
# 3xx,重定向
- 301,永久重定向,浏览器缓存,下次访问,直接跳转到定向地址
- 302,临时重定向,不缓存,可用于负载均衡、URL 增强(增加一些信息)、鉴权相关等。会将 POST 请求处理成 GET。
- 303,临时重定向,将浏览器重定向到另一个资源,新资源并不是请求的资源,而是对请求资源的描述,比如重置密码,服务器返回 303 响应,重定向到上传成功或者失败的页面。
- 304,缓存相关
- 307,和 302、303 类似,但是不会改变请求的方式。
# 4xx,请求错误
- 400,请求报文语法错误
- 401,需要有通过 HTTP 认证的认证信息或者表示用户认证失败
- 403,请求被拒绝
- 404,请求资源未找到
# 5xx,服务端错误
- 500,服务器内部错误
- 501,客户端请求,服务器不支持
- 502,服务器正常,代理服务器无法获取合法响应
- 503,服务器超负荷,或停机维护