http基础知识

‌HTTP(超文本传输协议)是万维网的基础通信协议,是互联网上应用最广泛的应用层协议,用于规范客户端(浏览器/APP)和服务器之间的请求与响应交互。

核心特性

  • ‌无状态‌:协议本身不保存客户端和服务端的连接状态,每次请求都是独立的,需要通过Cookie/Session维持会话状态
  • ‌简单灵活‌:报文结构简洁,基于文本传输,扩展方便,支持任意类型的数据传输
  • ‌分层设计‌:运行在TCP/IP协议栈的应用层,默认使用80端口,不依赖底层传输协议,现在HTTP/3已经基于QUIC(UDP)实现
  • ‌请求-响应模型‌:客户端主动发起请求,服务器被动返回结果,是典型的一问一答交互模式

完整交互流程
一次完整的HTTP请求响应流程分为5步:

  • ‌TCP连接建立‌:通过三次握手和服务器建立TCP连接
  • ‌请求发送‌:客户端发送构造好的HTTP请求报文(请求行+请求头+请求体)
  • ‌请求处理‌:服务器解析请求,处理业务逻辑,生成HTTP响应报文
  • ‌响应返回‌:服务器将响应报文(状态行+响应头+响应体)发送给客户端
  • ‌连接关闭‌:默认HTTP/1.1开启长连接,不会立即关闭,空闲超时后才会断开

tcp三次握手过程图
image

用「打电话约吃饭」的场景就能通俗理解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请求组成结构

  1. 请求行(请求第一行,必选)
    请求行是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

  1. 请求头(请求行之后,可选但基本必带)
    请求头是多行键值对格式的信息,用于向服务器传递客户端附加信息,帮助服务器做适配处理,常见请求头字段如下:
常见请求头 含义与作用
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表示请求完成后关闭连接

还是以企业微信为例
image

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

以企业微信创建部门为例
image

二、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‌ 网关超时 网关转发请求后,后端服务长时间未返回响应
posted @ 2026-06-10 13:56  alex_lau  阅读(24)  评论(0)    收藏  举报