1. HTTP 基础与工作原理
1.1 HTTP 协议的本质
HTTP(HyperText Transfer Protocol)是现代互联网的基石协议。作为应用层协议,它建立在TCP/IP协议栈之上,采用经典的请求-响应模型。理解HTTP的核心在于把握三个关键特性:
- 无状态性:每个请求相互独立,服务器不会记住之前的请求
- 明文传输:默认情况下请求和响应都是可读的文本格式
- 灵活可扩展:通过Headers和Body分离的设计实现高度可定制
实际开发中,我们最常接触的是HTTP/1.1版本,虽然HTTP/2和HTTP/3已经逐渐普及,但1.1版本仍是目前最广泛使用的标准。
1.2 完整HTTP事务生命周期
当你在浏览器地址栏输入http://localhost:3000/user并回车时,背后发生了这些关键步骤:
-
URL解析阶段:
- 浏览器解析出协议(http)、主机(localhost)、端口(3000)和路径(/user)
- 检查缓存(强缓存和协商缓存机制)
-
TCP连接建立:
- 三次握手过程(SYN → SYN-ACK → ACK)
- 本地随机端口与服务器3000端口建立连接
-
HTTP请求发送:
- 组装符合RFC标准的HTTP请求报文
- 通过建立的TCP连接发送二进制数据流
-
服务器处理流程:
- 服务器监听端口接收到数据流
- 解析请求行、请求头和请求体
- 路由匹配到对应的处理逻辑
-
响应返回阶段:
- 服务器组装响应报文(状态行、响应头、响应体)
- 通过TCP连接返回数据
-
浏览器渲染处理:
- 解析响应内容
- 根据Content-Type进行不同处理
- 更新DOM和页面状态
关键细节:HTTP/1.1默认使用持久连接(Connection: keep-alive),同一个TCP连接可以处理多个HTTP请求,显著提升了性能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. HTTP 报文结构深度解析
2.1 请求报文解剖
一个典型的GET请求报文如下:
code复制GET /api/users?id=123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer xxxxx
请求行包含三个核心要素:
- 方法(GET):定义操作类型
- 路径(/api/users):资源定位标识
- 协议版本(HTTP/1.1)
请求头常见重要字段:
- Host:虚拟主机支持的关键字段
- Content-Type:请求体类型(POST/PUT时必需)
- Authorization:认证凭证
- Accept:期望的响应格式
请求体:
- GET请求通常没有请求体
- POST/PUT请求包含JSON/FormData等数据
2.2 响应报文剖析
标准响应报文示例:
code复制HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600
Date: Sat, 01 Jan 2022 00:00:00 GMT
{"data": {...}}
状态行关键元素:
- 状态码(200):三位数字结果标识
- 状态文本(OK):人类可读描述
响应头重要字段:
- Content-Type:响应体实际类型
- Set-Cookie:会话控制机制
- Cache-Control:缓存策略指令
响应体:
- HTML/JSON/二进制等任意格式数据
- 长度由Content-Length或Transfer-Encoding决定
3. Node.js 原生HTTP服务实现
3.1 基础服务器搭建
Node.js内置的http模块提供了完整的HTTP服务器能力。以下是创建最小HTTP服务的代码:
javascript复制const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});
关键组件解析:
http.createServer():创建服务器实例- 回调函数:每个请求都会触发
req对象:包含请求的所有信息res对象:控制响应输出server.listen():启动监听指定端口
3.2 请求对象深度探索
req对象的重要属性和方法:
javascript复制console.log(req.method); // 'GET', 'POST'等
console.log(req.url); // '/path?query=string'
console.log(req.headers); // 请求头对象
// 获取客户端IP
const clientIP = req.socket.remoteAddress;
// 读取请求体(POST/PUT)
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
console.log(JSON.parse(body));
});
3.3 响应对象完全指南
res对象的核心功能:
javascript复制// 设置状态码
res.statusCode = 404;
// 设置响应头
res.setHeader('Content-Type', 'application/j
