知识库
接口返回大 JSON 导致首屏慢:字段裁剪、分页与流式响应的取舍
问题定位 当接口返回的 JSON 体积过大(例如超过 1MB),首屏加载时间会显著增加。原因包括:网络传输耗时、客户端 JSON 解析耗时、以及可能的内存峰值。优化前,建议先通过浏览器开发者工具或抓包工具确认响应体大小和耗时分布。 字段裁剪…
用 C 写一个极简 HTTP 服务器:从 socket 到解析请求行
用 C 写一个极简 HTTP 服务器:从 socket 到解析请求行 HTTP 服务器本质上是一个监听 TCP 端口的程序,接收连接、读取请求、返回响应。本文用 C 语言实现一个仅支持 GET 请求的极简服务器,重点展示从创建 socket…
接口幂等键该放在请求头还是请求体:从重试链路反推设计位置
在设计幂等接口时,幂等键(Idempotency Key)的位置选择——请求头还是请求体——常引发争论。本文从重试链路的实际行为出发,分析两种方案的适用场景,并给出可落地的设计建议。 重试链路的典型形态 客户端重试通常有两种模式: 1. 自…
用状态机重写满是 if-else 的订单流程:从状态爆炸到可测试的迁移表
问题:订单流程里的 if else 泥潭 几乎每个电商系统都有这样一段代码: 每加一个状态或动作,就要在所有分支里补判断。测试时也只能一个个场景去构造,漏掉一条路径线上就出问题。这种写法的问题不是“不优雅”,而是 状态和迁移规则散落在代码里…
接口版本兼容的三种策略:URL 版本、请求头协商与字段只增不删
当接口需要变更时,如何在不破坏现有客户端的前提下发布新版本,是每个后端开发者必须面对的问题。常见的策略有三种:URL 版本、请求头协商和字段只增不删。它们各有适用场景,理解其原理和取舍,能帮助你做出更合理的设计决策。 策略一:URL 版本 …
从零理解 JWT:签名、过期与刷新机制在前后端分离项目中的落地
为什么需要 JWT 在前后端分离架构中,后端通常只提供 RESTful API,不再依赖 Session 和 Cookie。JWT(JSON Web Token)是一种无状态的令牌方案,服务端签发后,客户端在每次请求时通过 Authoriz…
限流算法选型:计数器、漏桶与令牌桶在接口层的落地差异
为什么接口需要限流? 限流是保护系统免受过载请求冲击的常用手段。无论是防止恶意爬虫、应对突发流量,还是保障核心接口的稳定性,选择合适的限流算法都至关重要。本文对比计数器、漏桶和令牌桶三种算法在接口层的落地差异,帮助你做出合理选型。 1. 固…
幂等性设计实战:支付、重试与消息重复场景下如何保证接口安全
在分布式系统中,网络超时、用户重复点击、消息重投递等问题难以避免,导致同一个请求可能被多次执行。对于支付、订单创建等关键操作,重复执行会造成资金损失或数据错乱。幂等性设计正是为了解决这一问题: 无论请求执行多少次,对系统状态的影响都和执行一…
验证码存进远程缓存,一次网络抖动就让整条登录链路失败
登录接口本来好好的,可一到网络不稳的时候就开始抽风:明明验证码是对的,用户却收到"验证码错误"或"系统繁忙";刷新一下又能用,再刷新又不行。查日志发现,报错的位置根本不是验证码校验逻辑,而是它"够不到"存验证码的地方。 现象 验证码接口在高…
后台点一下浏览器收到 504 但其实成功了:最误导人的假失败
管理后台有个"立即生成"按钮,点下去转圈,几十秒后浏览器跳出一个 504。你以为是失败了,于是又点了一次。结果是——任务跑了两次,数据里多了一份。 现象 管理后台的"立即生成"按钮点下去后,浏览器等待大概一分钟,最终收到: 页面显示请求失败…
加了一个日志过滤器,所有 POST 接口突然报"必需请求体缺失"
你给后端加了一个自定义日志过滤器,想把每个请求的出入参都记下来方便排查。加完之后,所有 POST 接口齐刷刷报错,说请求体是空的。 现象 加了一个自定义日志过滤器之后,所有 POST 接口突然报: GET 接口正常,但凡是需要读 body …
匿名调用代码托管平台 API 批量下载,很快就被限流
批量下载代码仓库的时候,前几十个正常,跑着跑着突然全部变成 403。你以为是被封了 IP,其实是撞上了一个大多数人根本不知道的配额限制。 现象 调某代码托管平台的 API 批量下载文件,中途开始 全部返回 403 : 响应体里通常带着明确的…
如何设计一个可扩展的 REST API
设计一个可扩展的 REST API,关键在于让 API 在业务增长、流量增加时,能通过增加资源而非重写代码来应对变化。以下原则和实践可帮助你构建更易扩展的 API。 1. 资源导向的 URL 设计 使用名词复数表示资源集合:/users、/…