http基础知识
HTTP(超文本传输协议)是万维网的基础通信协议,是互联网上应用最广泛的应用层协议,用于规范客户端(浏览器/APP)和服务器之间的请求与响应交互。
核心特性
- 无状态:协议本身不保存客户端和服务端的连接状态,每次请求都是独立的,需要通过Cookie/Session维持会话状态
- 简单灵活:报文结构简洁,基于文本传输,扩展方便,支持任意类型的数据传输
- 分层设计:运行在TCP/IP协议栈的应用层,默认使用80端口,不依赖底层传输协议,现在HTTP/3已经基于QUIC(UDP)实现
- 请求-响应模型:客户端主动发起请求,服务器被动返回结果,是典型的一问一答交互模式
完整交互流程
一次完整的HTTP请求响应流程分为5步:
- TCP连接建立:通过三次握手和服务器建立TCP连接
- 请求发送:客户端发送构造好的HTTP请求报文(请求行+请求头+请求体)
- 请求处理:服务器解析请求,处理业务逻辑,生成HTTP响应报文
- 响应返回:服务器将响应报文(状态行+响应头+响应体)发送给客户端
- 连接关闭:默认HTTP/1.1开启长连接,不会立即关闭,空闲超时后才会断开
tcp三次握手过程图

用「打电话约吃饭」的场景就能通俗理解TCP三次握手,核心就是双方确认「我能发,你能收」,保证双向通信都正常。
第一次握手:客户端发起连接
👉 客户端:"喂,我想找你聊天,你能听到我说话吗?"
客户端的状态从「CLOSED(关闭)」变成「SYN-SENT(同步已发送)」,等待服务器回复。
第二次握手:服务器确认接收
👉 服务器:"我能听到你说话啦,我也想找你聊天,你能听到我说话吗?"
服务器收到客户端的连接请求后,确认了自己的接收能力正常,把状态从「LISTEN(监听)」变成「SYN-RECEIVED(同步已接收)」,同时给客户端发自己的连接确认。
第三次握手:客户端确认接收
👉 客户端:"我能听到你说话啦,那我们开始聊天吧!"
客户端收到服务器的确认后,确认自己的发送、接收都正常,服务器也确认了自己的接收,客户端状态变成「ESTABLISHED(已连接)」;服务器收到这次确认后,也确认自己发送、接收都正常,状态也变成「ESTABLISHED(已连接)」。
此时双向连接正式建立,双方可以开始传输数据了。
四次挥手本质是TCP关闭连接时,双方分别确认「我发完数据了,你也收完了」的双向断开过程,同样用「打电话约饭结束」的场景通俗理解:
第一次挥手:客户端发起断开请求
👉 客户端:"我这边说完所有内容啦,准备挂电话了,你这边说完了吗?"
客户端状态从ESTABLISHED(已连接)变成FIN-WAIT-1(等待服务器确认),向服务器发送「我要断开连接」的请求。
第二次挥手:服务器确认收到断开请求
👉 服务器:"我收到你要挂的消息啦,不过我这边还有最后几句话没说完,等我说完哦。"
服务器收到断开请求后,告诉客户端"我知道你要断开了",此时服务器进入CLOSE-WAIT(关闭等待)状态;客户端收到确认后进入FIN-WAIT-2(等待服务器最终断开),此时客户端不再发新数据,等待服务器通知断开。
第三次挥手:服务器发起断开请求
👉 服务器:"我这边也说完所有内容啦,可以挂电话了。"
服务器说完所有内容后,向客户端发起断开请求,进入LAST-ACK(最后确认)状态,等待客户端确认。
第四次挥手:客户端确认断开完成
👉 客户端:"好的,我收到你要挂了,你挂吧。"
客户端收到服务器的断开请求后,发送最终确认,进入TIME-WAIT(时间等待)状态,等待2MSL(最长报文寿命)后正式关闭连接;服务器收到确认后,直接进入CLOSED(关闭)状态,完成断开。
一、HTTP请求组成结构
- 请求行(请求第一行,必选)
请求行是HTTP请求的开头,用于说明请求方法、请求资源路径、HTTP协议版本,格式固定为:
[请求方法] [资源路径] [HTTP版本]
以企业微信api接口为例
https://developer.work.weixin.qq.com/document/path/90196
读取成员的接口为
请求方式:GET(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID
- 请求头(请求行之后,可选但基本必带)
请求头是多行键值对格式的信息,用于向服务器传递客户端附加信息,帮助服务器做适配处理,常见请求头字段如下:
| 常见请求头 | 含义与作用 |
|---|---|
| Host | 指定请求服务器的域名/IP地址和端口,用于区分同一服务器下的多个站点,HTTP/1.1强制要求携带 |
| User-Agent | 告知服务器发送请求的客户端信息,比如浏览器类型、操作系统、设备信息,服务器可根据它返回适配不同设备的页面 |
| Accept | 告知服务器客户端可以接收的响应数据类型,比如text/html(HTML网页)、application/json(JSON数据),/表示任意类型 |
| Content-Type | 说明请求体的数据类型,POST请求必带,比如application/x-www-form-urlencoded(普通表单)、application/json(JSON格式) |
| Content-Length | 说明请求体的长度(字节) |
| Cookie | 向服务器携带客户端保存的Cookie信息,用于维持登录状态等会话 |
| Connection | 控制连接行为,keep-alive表示保持长连接,close表示请求完成后关闭连接 |
还是以企业微信为例

- 请求体(最后一部分,可选)
请求体用于存放需要发送给服务器的业务数据,只有特定请求方法(如POST、PUT)才会携带:
- GET请求一般没有请求体,参数会拼接在URL的?后作为查询参数传递
- POST请求会把表单数据、JSON数据等存放在请求体中发送,适合传递大量、复杂的业务数据
以企业微信创建部门为例

二、HTTP常见请求方法及作用
HTTP定义了多种请求方法,不同方法对应不同操作语义,常见方法如下:
| 请求方法 | 核心作用 | 使用场景 |
|---|---|---|
| GET | 获取数据 | 最常用,用于请求服务器资源,比如获取网页、查询接口数据,参数拼接在URL中,安全性较低且长度有限 |
| POST | 提交数据 | 用于向服务器提交数据,比如提交表单、上传文件、创建资源,数据放在请求体中,支持大量数据传递 |
| PUT | 更新数据 | 用于向服务器更新已存在的完整资源,属于幂等请求 |
| DELETE | 删除数据 | 用于删除服务器指定资源,属于幂等请求 |
| HEAD | 获取响应头 | 和GET类似,但服务器只返回响应头不返回响应体,用于测试资源是否存在、获取资源元信息 |
| OPTIONS | 查询支持方法 | 用于预请求跨域,询问服务器支持哪些请求方法和跨域规则 |
面试常考get和post请求区别
GET和POST是HTTP最常用的两个请求方法,核心区别是语义和设计定位不同:GET用于从服务器获取资源,POST用于向服务器提交数据,具体差异对比如下:
| 对比维度 | GET请求 | POST请求 |
|---|---|---|
| 核心语义 | 获取/查询服务器资源 | 提交/创建资源(如表单、用户数据) |
| 参数位置 | 参数拼接在URL后(?key=value&...) | 参数放在请求体中 |
| 数据长度限制 | 受URL长度限制(浏览器/服务器通常限制为几KB到8KB) | 理论无长度限制,可传输大体积数据(如上传文件) |
| 安全性 | 参数明文暴露在URL中,不能传递敏感信息(如密码) | 参数在请求体中,不会直接暴露,但抓包仍可查看,本身不加密 |
| 缓存特性 | 可被浏览器缓存,重复请求会直接读取缓存 | 默认不会被缓存,每次都向服务器重新请求 |
| 幂等性 | 是幂等的:多次调用结果一致,不会修改服务器数据 | 非幂等:多次提交可能创建多个资源(比如重复下单扣款) |
| 适用场景 | 页面跳转、查询接口、静态资源获取、搜索关键词 | 表单提交、登录注册、文件上传、数据修改/创建、接口提交业务数据 |
三、HTTP返回码
HTTP返回码(状态码)是服务器返回给客户端的三位数字编码,用于标识本次请求的处理结果,共分为5大类,每类对应不同处理状态,下面是分类详解:
返回码分类总览
| 分类范围 | 含义说明 |
|---|---|
| 1xx | 信息提示:请求已接收,需要继续处理(很少用到) |
| 2xx | 成功:请求已被服务器成功接收并处理 |
| 3xx | 重定向:需要客户端进一步操作才能完成请求 |
| 4xx | 客户端错误:请求语法错误/无法被服务器处理 |
| 5xx | 服务器错误:服务器处理请求时发生内部错误 |
常见重点返回码详解
| 返回码 | 含义说明 | 常见场景 |
|---|---|---|
| 200 OK | 请求成功 | 接口正常返回、网页正常加载、GET/POST请求处理成功 |
| 201 Created | 创建成功 | POST/PUT请求成功创建了服务器资源(比如新增用户、创建订单) |
| 204 No Content | 无内容 | 请求处理成功,但没有返回内容(比如删除接口处理完成) |
| 301 Moved Permanently | 永久重定向 | 域名更换、HTTP跳转到HTTPS,搜索引擎会更新网址 |
| 302 Found | 临时重定向 | 登录跳转、临时维护跳转,搜索引擎保留原网址 |
| 304 Not Modified | 资源未修改 | 浏览器缓存命中,服务器告诉客户端直接使用本地缓存,不用重新传输,节省带宽 |
| 400 Bad Request | 请求参数错误 | 请求参数格式错误、缺少必填参数,JSON语法错误 |
| 401 Unauthorized | 未授权 | 用户未登录/登录凭证过期,需要重新登录后再请求 |
| 403 Forbidden | 禁止访问 | 用户已登录,但没有访问该接口的权限,IP被服务器封禁 |
| 404 Not Found | 资源不存在 | 请求的接口路径错误、服务器上没有对应资源 |
| 405 Method Not Allowed | 请求方法不允许 | 接口只支持POST,客户端用了GET请求,或者反过来 |
| 408 Request Timeout | 请求超时 | 请求发送超时,客户端长时间没完成请求发送 |
| 409 Conflict** | 资源冲突 | 创建资源时,资源ID已经存在,比如重复创建同名用户 |
| 429 Too Many Requests | 请求过于频繁 | 客户端触发服务器限流,需要降低请求频率后重试 |
| 500 Internal Server Error | 服务器内部错误 | 后端代码抛出异常、程序出错,无法正常处理请求 |
| 502 Bad Gateway | 网关错误 | 反向代理/网关收到后端服务器无效响应,常见于后端服务重启、网络不通 |
| 503 Service Unavailable | 服务不可用 | 服务器过载维护、后端服务宕机,临时无法处理请求 |
| 504 Gateway Timeout | 网关超时 | 网关转发请求后,后端服务长时间未返回响应 |

浙公网安备 33010602011771号