第 7 章 · 02 HTTP 请求解析与响应构造 本节摘要:socket 收到的是原始字节流,本节讲怎么把它解析成结构化的 HTTP 请求(请求行+头+体),以及怎么构造 HTTP 响应(状态行+头+体)。HTTP 是纯文本协议——请求行 、头键值对到空行、可选体;响应同理。理解 HTTP 是文本协议,你就能用任何语言手写解析,不依赖框架。 内容来源:基于 HTTP 协议整理的导读,呼应姊妹篇《Linux 命令》第 7 章 curl。 学习目标 解析 HTTP 请求:请求行(方法+路径+版本)、头(键值对到空行)、体(按 Content-Length)。 构造 HTTP 响应:状态行(版本+状态码+原因)、头、体。 理解 HTTP 是纯文本协议,按行分隔。
本节摘要:socket 收到的是原始字节流,本节讲怎么把它解析成结构化的 HTTP 请求(请求行+头+体),以及怎么构造 HTTP 响应(状态行+头+体)。HTTP 是纯文本协议——请求行
GET /path HTTP/1.1、头键值对到空行、可选体;响应同理。理解 HTTP 是文本协议,你就能用任何语言手写解析,不依赖框架。
内容来源:基于 HTTP 协议整理的导读,呼应姊妹篇《Linux 命令》第 7 章 curl。
很多人觉得 HTTP「被框架封装了」,神秘。其实它就是文本:请求是几行文本,响应是几行文本。亲手解析一遍,你不仅会造 Web 服务器,更懂得浏览器/curl 发出的请求长什么样、服务器返回的响应长什么样——这是调试 Web 应用的基本功。
GET /api/users?id=1 HTTP/1.1 ← 请求行: 方法 路径 版本 Host: localhost:8080 ← 头(键值对) User-Agent: curl/7.81 Content-Length: 0 ← 空行 = 头结束 (若有体, 按 Content-Length 读) ← 体
解析步骤:按 \r\n 切行;第一行是请求行(三段空格分);后续到空行是头(Key: Value);按 Content-Length 读体。
HTTP/1.1 200 OK ← 状态行: 版本 码 原因 Content-Type: text/html ← 头 Content-Length: 13 ← 空行 Hello, world! ← 体
构造:状态行 + 头(含 Content-Length/Content-Type)+ 空行 + 体。
2xx 成功(200 OK)、3xx 重定向(301 永久)、4xx 客户端错(404 没找到、403 禁止)、5xx 服务端错(500 内部错误)。呼应姊妹篇《Linux 命令》第 7 章 curl 看状态码。
\r\n 分行。方法 路径 版本;状态行:版本 码 原因。Key: Value。下一节讲请求路由——把「方法+路径」分派到处理函数。