HTTP 协议
一、引言:Web 通信的本质
在学习 Go Web 开发时,我们通常会接触到大量的 HTTP 概念。
简单来说,HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络传输协议。它规定了浏览器(客户端)与 Web 服务器(服务端)之间如何进行数据交换。
当你输入一个网址并按下回车时,本质上就是你的浏览器向目标服务器发送了一个符合 HTTP 规范格式的"请求包" 。服务器收到后解析该请求,处理业务逻辑,然后将处理结果以**特定格式的"响应包"**返回给你的浏览器。
这就是 Web 交互最底层的本质:请求与响应。
二、HTTP 协议的核心特点
-
简单灵活:HTTP 基于文本,格式清晰,扩展性强(通过添加新的头部字段即可)。
-
无状态(Stateless) :HTTP 协议本身不保存客户端的状态。这意味着你上一次请求发了什么,服务器在这一次请求时完全不知道。这也是为什么我们需要
Cookie、Session或Token来维持用户登录状态的原因。 -
应用层协议:它在 TCP/IP 协议栈中处于应用层,默认运行在 80 端口(HTTP)或 443 端口(HTTPS)。
-
持久连接(Keep-Alive):早期 HTTP 每次请求都需要新建 TCP 连接,效率很低。现代 HTTP/1.1 及以后版本支持 Keep-Alive,允许在一次 TCP 连接上发送多次 HTTP 请求。
三、HTTP 报文结构:拆解一次网络交互
HTTP 报文分为请求报文 和响应报文,结构非常类似,都包含四个部分:
1. HTTP 请求报文
-
请求行 :包含请求方法、请求路径(URL)和 HTTP 版本。例如:
GET /index.html HTTP/1.1 -
请求头(Header) :包含一系列键值对,用于告诉服务器客户端的配置信息(如浏览器类型
User-Agent、期望的数据类型Accept等)。 -
空行:请求头和请求体之间必须有一个空行,用来分隔。
-
请求体(Body):通常是 POST 请求中携带的数据(例如表单提交的内容、JSON 数据)。
2. HTTP 响应报文
-
状态行 :包含 HTTP 版本、状态码和状态描述。例如:
HTTP/1.1 200 OK。 -
响应头(Header) :服务器返回的一些元数据,例如
Content-Type(数据格式,如application/json)、Content-Length(数据长度)。 -
空行:同样是分隔符。
-
响应体(Body):服务器真正返回给客户端的数据(通常是我们前端看到的页面 HTML、图片或者是后端接口返回的 JSON 数据)。
四、核心方法与状态码
常用的 HTTP 方法:
-
GET:获取资源(只读,幂等)。 -
POST:提交/创建资源(通常用于表单提交)。 -
PUT:全量更新资源(幂等)。 -
DELETE:删除资源。 -
PATCH:局部更新资源。
(注:在微服务和 RESTful API 设计中,这些方法常与数据库的 CRUD 操作一一对应。)
常见的 HTTP 状态码:
-
2xx代表成功:200 OK:请求成功。
-
3xx代表重定向:-
301 Moved Permanently:资源被永久迁移。 -
302 Found:资源临时迁移。
-
-
4xx代表客户端错误:-
400 Bad Request:客户端发送的请求语法错误。 -
401 Unauthorized:未授权(未登录或 Token 过期)。 -
403 Forbidden:服务器拒绝执行(权限不足)。 -
404 Not Found:请求的资源不存在。
-
-
5xx代表服务端错误:500 Internal Server Error:服务器内部发生未预期的错误。
五、HTTPS:安全的 HTTP
HTTP 是明文传输的,存在窃听、篡改、冒充三大风险。HTTPS 则是 HTTP 的安全版本,它在 HTTP 和 TCP 之间加入了一层 SSL/TLS 加密层。
HTTPS 通过非对称加密实现身份认证和密钥交换,通过对称加密实现数据传输加密,从而保证通信的机密性、完整性和真实性。
六、总结
理解 HTTP 协议是学习 Web 开发的基石。它看似简单(只有请求和响应),但背后涵盖了网络通信、无状态设计、RESTful 设计规范等诸多计算机核心思想。
在浏览器中打开开发者工具(F12)的"网络"面板,可以观察每一次请求的 Headers 和 Response。