HTTP 请求
请求格式
请求格式由首行、请求头(Header)、空行和正文(Body)组成。

首行组成
首行由请求方法、URL 和版本号组成,使用空格分隔。

请求方法
| 方法 | 说明 | 支持的 HTTP 版本 |
|---|
| GET | 获取资源 | 1.0, 1.1 |
| POST | 传输实体主体 | 1.0, 1.1 |
| PUT | 传输文件 | 1.0, 1.1 |
| DELETE | 删除文件 | 1.0, 1.1 |
| HEAD | 获取报文首部 | 1.0, 1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径 | 1.1 |
| CONNECT | 要求用隧道协议连接代理 | 1.1 |
| LINK | 建立和资源之间的联系 | 1.0 |
| UNLINK | 断开连接关系 | 1.0 |
-
GET 方法:最常用的 HTTP 方法,常用于获取服务器上的某个资源。
GET 方法特点:首行的第一部分为 GET。URL 的 query string 可以为空,也可以不为空。Header 部分有若干个键值对结构。Body 部分一般没有,正文包含在 URL 的查询字符串中。
-
POST 方法:常用于提交用户输入的数据给服务器(例如登录页面)。可通过 HTML 中的 form 标签构造,或使用 JavaScript 的 Ajax 构造。
POST 请求的特点:首行的第一部分为 POST。URL 的 query string 一般为空(也可以不为空)。Header 部分有若干个键值对结构。Body 部分一般不为空,Body 内的数据格式通过 Header 中的 Content-Type 指定,长度由 Content-Length 指定。
GET 与 POST 的区别:
- 语义不同:GET 一般是获取数据,POST 一般是提交数据。
- 携带数据的方式不同:
- GET 的 Body 一般为空,需要传递的数据通过 query string 传递。
- POST 的 query string 一般为空,需要传递的数据通过 Body 传递。
- 幂等性:GET 请求通常建议是幂等的(多次请求结果一样),设计成幂等时可被缓存;POST 不能被缓存。
- 实际使用中两者区别不大,常被混用。
URL 组成
URL 组成:协议名称 : //要访问的服务器的 IP 地址或域名/端口号/带有层次结构的路径?查询字符串

成分解析:
- 协议名称:使用的协议。
- 服务器 IP 或域名:确定主机(IP 和域名转换通过 DNS 完成)。
- 端口号:确定程序。未写则默认:HTTP 为 80,HTTPS 为 443。
- 路径:确定具体资源。
- 查询字符串 (query string):本质是键值对结构,键值对之间用&分隔,键和值之间用=分隔。
- 片段标识符:用于页面内跳转,现在较少使用。
- 登陆信息:在协议名与服务器 IP 之间,现代网站身份认证一般不再通过 URL 进行,通常省略。
URLEncode:
像 / ? : 等字符已被 URL 视为特殊意义,不能随意出现。若参数中包含这些特殊字符,需先转义。非英语文字也会进行转义。
规则:将字符转为 16 进制,从右到左取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上%,编码成%XY 格式。
URL 中的可省略部分:
- 协议名:可省略,默认为 http://
- IP 地址/域名:HTML 中可省略(如 img, link, script, a 标签的 src 或 href),表示与当前 HTML 所属域名一致。
- 端口号:可省略。HTTP 默认为 80,HTTPS 默认为 443。
- 路径:可省略,相当于 /。部分服务器会自动访问/index.html。
- 查询字符串:可省略。
- 片段标识:可省略。
- 登陆信息:可省略。
Header 整体格式为'键值对'结构,每个键值对占一行,键和值之间使用冒号加空格分割。键和值通过 RFC 标准文档 规定。
Host
Host 表示服务器主机的地址和端口。

Content-Length 和 Content-Type
- Content-Length:表示 Body 中的数据长度,单位为字节。
- Content-Type:表示 Body 中的数据格式。

关于 Content-Type 的详细取值请参考:文档
注意事项:
- 有时请求中没有 Body 正文,就不会有这两个 Header。
- 如果有 Body 正文,缺少这两个 Header 或只有其中一个,则为非法请求或响应。
User-Agent (简称 UA)
User-Agent 表示用户使用的设备的浏览器和操作系统情况。

Referer
表示这个页面是从哪个页面跳转过来的。直接输入 URL 或点收藏栏打开的页面没有 Referer。

Cookie
Cookie 中存储了一个字符串,数据可能来自客户端(网页自行通过 JS 写入)或服务器(服务器在 HTTP 响应的 Header 中通过 Set-Cookie 字段返回)。常用来实现'身份标识'功能。
Cookie 是浏览器允许网页在本地硬盘存储数据的一种机制,并非让网页代码直接访问文件系统,而是提供了一层抽象的键值对存储机制。
Cookie 按照键值对形式存储,每个 Cookie 之间用分号分开。

通用场景:登录和用户认证。

在服务器端:
- 查询数据库,验证用户名密码是否有效。
- 如果匹配成功:
- 生成 sessionId。
- 生成 Session 对象。
- 把用户的关键信息保存到 Session 对象中。
- 把 sessionId 和 Session 对象作为键值对,保存到内存的 Hash 表中。
- 把 sessionId 通过 Set-Cookie 返回给浏览器。
- 服务器收到后续请求之后,直接通过 Cookie 中的 sessionId 就可以知道当前请求是哪个用户发来的,无需用户重新登录。
正文 Body
正文中的内容格式和 Header 中的 Content-Type 密切相关。可通过抓包观察以下几种情况:

- application/x-www-form-urlencoded

- application/json:数据为 JSON 格式。

- multipart/form-data:Form 表单提交的数据格式(在 form 标签中加上 enctype="multipart/form-data",通常用于提交图片/文件)。

- application/x-www-form-urlencoded:Form 表单提交的数据格式。

HTTP 响应
格式
响应格式:首行 + 响应头(Header)+ 空行 + 正文(Body)
状态码 (Status Code)
状态码表示访问一个页面的结果(成功、失败或其他情况)。

常见状态码:
- 200 OK:表示访问成功
- 404 Not Found:表示访问的资源没找到,URL 输入错了
- 403 Forbidden:访问被拒绝,没有权限
- 405 Method Not Allowed:请求方法错了
- 500 Internal Server Error:服务器错误
- 504 Gateway Timeout:访问超时。Gateway 表示网关,网络的入口。
- 302 Move temporary:临时重定向,访问该 URL 会跳转到另一个。
分类:
- 2xx 代表成功
- 3xx 代表重定向
- 4xx 代表客户端访问出错
- 5xx 代表服务器错误
响应报头的基本格式和请求报头的格式基本一致。
Content-Type 常见取值:
- text/html:Body 数据格式是 HTML
- text/css:Body 数据格式是 CSS
- application/javascript:Body 数据格式是 JavaScript
- application/json:Body 数据格式是 JSON
响应正文 (Body)
正文的具体格式取决于 Content-Type。观察下面几个抓包结果中的响应部分。



