如何设计一个API?

📅 2026/7/10 1:21:52
如何设计一个API?
前言日常研发中我们常需对接外部第三方平台或是对外提供开放API供合作方调用。一套标准化、高可用的开放API需要同时兼顾安全防护、请求可重放防护、服务稳定性、故障快速定位、接入友好性五大核心目标。下文从14个核心维度梳理完整落地规范覆盖网关层、业务层、运维层全链路设计。一、请求签名机制防篡改、防重放设计目的解决两大核心风险① 请求参数传输途中被篡改② 黑客抓取合法请求报文后重复调用抓包重放攻击。实现流程调用方组装签名原文请求业务参数 当前时间戳timestamp 密钥按固定排序规则拼接为待签字符串生成签名值sign通过MD5/SHA256等哈希算法计算摘要将sign放入请求头/请求参数随请求传递网关校验逻辑网关提取请求参数、时间戳根据请求头中的accessKey查询对应密钥用完全相同规则重算签名与传入sign对比签名不一致直接返回「签名校验失败」拦截请求签名一致放行至后续校验流程。核心细节时间戳的必要性仅靠签名无法抵御重放攻击因此必须加入时间戳并设置请求有效期推荐15分钟网关收到请求后校验当前服务器时间与请求携带timestamp的差值超出有效期直接拦截。即便黑客窃取完整请求报文超时后报文彻底失效大幅提升攻击成本。两种密钥分发方案固定密钥模式双方线下约定统一privateKey适用于少量固定合作方AK/SK标准模式推荐平台分配唯一accessKey(AK)、secretKey(SK)AK通过请求头传递用于网关快速匹配合作方SK仅用于本地签名计算禁止在网络传输、前端代码中暴露。二、数据传输加密保护敏感明文接口若传输银行卡、身份证、手机号、交易金额等隐私核心数据明文传输存在泄露风险需分层加密处理。基础编码Base64仅为编码手段不具备加密安全性仅用于结构化报文统一封装统一规范所有业务报文放入请求body唯一字段dataBase64编码后传输网关解密后再反序列化参数。不建议多层Base64叠加增加对接调试成本。生产级对称加密推荐高敏感场景替换Base64采用AES-128/AES-256、DES等标准对称加密双方约定加密密钥、偏移量、填充规则网关统一解密后再执行业务校验。传输层兜底所有开放API强制HTTPS防止链路抓包窃取原始加密前数据。三、IP白名单WAF多层访问权限隔离签名、加密存在泄露风险需增加网络层访问限制构建第二道安全防线网关IP白名单仅合作方报备的服务器出口IP允许调用非白名单IP直接返回「无访问权限」支持单合作方配置多IP、动态更新白名单。Web防火墙兜底防护若合作方服务器被攻陷黑客可从内网合法IP发起攻击需部署ModSecurity等WAF拦截SQL注入、XSS、恶意请求、高频异常探测过滤攻击特征报文。四、分级限流保障服务不被打垮第三方调用并发不可控突发流量极易造成服务雪崩在网关层实现多维度限流搭配Redis/Nginx实现分布式管控按合作方AK限流核心同一AK全局总请求阈值例如单客户每分钟≤10000次区分免费/付费客户配置差异化额度。按接口粒度限流针对高危批量接口单独限制例如分页查询、批量提交接口每分钟≤2000次避免单一接口耗尽资源。按请求IP限流限制单IP请求频次防止客户侧多机器并发刷接口。异常处理超出阈值统一返回429状态码标准化提示「请求过于频繁请稍后重试」。五、全链路参数校验提前拦截无效请求所有参数在校验通过后再进入数据库、复杂业务逻辑节省服务器资源规避脏数据、资金风险。校验覆盖范围基础规则必填项非空、字段长度、数值上下限、数据类型业务规则金额不能为负数、状态仅允许指定枚举值、日期格式合规批量接口单批次最大条数限制。Java落地方案通用校验Hibernate Validator内置注解NotEmpty、Size、Min、Max扩展校验自定义注解实现日期、枚举、手机号、身份证等特殊格式校验。价值提前拦截非法参数避免数据库报错、异常数据入库、资金逻辑漏洞。六、全局统一返回体降低对接沟通成本反例痛点网关异常、业务异常返回两套完全不同的JSON结构code/rt、message/errorMsg、data/result混用对接方需要写两套解析逻辑维护成本极高。标准化统一返回格式全局唯一{code:0,// 0成功非0业务/系统错误码message:操作成功,data:{}// 业务数据异常时为null}统一实现方案所有请求强制经过API网关业务服务自定义业务异常携带错误码与提示信息网关统一捕获所有异常网关鉴权异常、业务异常、系统崩溃异常统一封装为上述结构返回全局统一错误码规范10xx签名/权限类、20xx参数错误、429限流、500系统内部异常。七、统一异常脱敏处理杜绝敏感信息泄露禁止将数据库报错、堆栈、SQL语句、服务器路径、表结构等原始异常信息返回给第三方防止黑客利用漏洞脱库、注入攻击。处理规范对外返回统一code500message固定为「服务器内部异常请联系平台排查」内部留存网关/业务层完整打印异常堆栈、SQL、请求参数至日志分层拦截网关优先拦截网络、鉴权类异常业务全局异常处理器拦截数据库、代码异常统一脱敏输出。八、全链路请求日志快速定位线上问题日志是排查第三方对接故障的核心依据要求日志完整、可追溯、支持客户自助查询。日志必填字段请求URL、请求方式、请求头、原始加密参数、解密后明文参数、响应结果、耗时、timestamp、traceId、调用方AK、客户端IP。traceId设计全链路唯一追踪ID贯穿网关、业务、MQ、数据库日志可一键过滤单次请求完整链路快速区分不同客户请求。日志存储方案运维排查本地日志文件ELK存储客户自助排查日志落地MongoDB/ES搭建轻量化查询后台给合作方开放只读查询权限减少客服沟通成本。九、接口幂等设计抵御重复请求第三方客户端重试、网络超时重发、业务bug均会导致短时间内重复调用同一接口若不做幂等会产生重复订单、重复扣款、重复数据。幂等实现方案推荐方案全局requestId调用方每次请求携带唯一requestId网关缓存至Redis设置过期时间相同requestId重复请求直接返回上次处理结果不执行业务逻辑。数据库兜底核心业务表建立唯一索引订单号、外部业务单号数据库层面拦截重复写入。效果相同参数多次调用仅首次执行业务后续请求直接返回成功不会生成脏数据。十、批量接口条数限制控制接口耗时批量新增、批量查询接口极易因单次传入上万条数据引发超时、内存溢出统一做条数管控标准阈值单次请求最大500条可配置化调整拦截规则超过阈值直接返回参数错误提示「单次批量数据不能超过500条」前期对齐接口文档提前告知合作方分批次循环调用避免上线后批量报错。十一、上线前压力测试验证服务承载上限限流阈值不能凭经验设定必须通过压测验证真实承载能力工具JMeter、Apache Bench、Locust压测目标获取各接口稳定QPS、平均响应时间、超时临界点落地价值合理规划服务器集群节点数量修正不合理限流阈值例如限流50QPS但服务仅能稳定承载30QPS需下调阈值提前暴露慢SQL、同步长耗时逻辑等性能瓶颈。十二、异步化处理缩短接口响应时长同步接口若包含复杂批量计算、文件处理、第三方回调、大数据统计极易超时采用「接收即返回、后台异步处理」架构优化实现流程网关接收请求参数校验、幂等校验通过后发送消息至MQ立即返回成功告知客户任务已受理独立消费者线程异步执行业务逻辑。合作方结果获取两种方案主动回调推荐支付、订单场景通用平台处理完成后主动调用合作方预留回调接口推送处理结果轮询查询客户定时调用「任务状态查询接口」传入任务ID批量拉取处理进度。十三、返回数据脱敏保护用户隐私接口返回手机号、身份证、银行卡、地址等敏感信息时必须脱敏展示即便数据泄露也无法完整盗用手机号182****8887身份证4401********1234银行卡6228********5678脱敏逻辑统一封装在网关/返回工具类全局复用避免各业务代码脱敏规则不统一。十四、标准化接口文档降低对接成本完整规范的文档可大幅减少双方沟通、联调时间文档需包含以下标准化内容基础信息开放域名、接口地址、请求方式POST/GET鉴权规则AK/SK申请渠道、签名算法、时间戳有效期、完整签名示例参数规范入参/出参字段名称、类型、长度、是否必填、枚举说明统一错误码全集每个code对应含义、排查建议加密/传输规范加密算法、data字段编码规则调用DemoJava/PHP/Python等主流语言完整请求示例约束说明IP白名单申请、限流阈值、批量条数限制、幂等requestId规则全局命名统一规范字段统一驼峰命名ID统一Long类型长度20状态status统一int时间字段统一字符串格式yyyy-MM-dd HH:mm:ss。整体架构落地总结整套开放API能力全部收敛至API网关层统一管控业务服务只负责纯业务逻辑无需重复实现鉴权、签名、限流、日志、异常处理等通用能力安全层HTTPS AK/SK签名 时间戳防重放 IP白名单 WAF 数据加密脱敏稳定层多维度限流 幂等机制 批量条数限制 异步MQ解耦运维层全链路trace日志 统一异常脱敏 上线压测接入层统一返回体 参数前置校验 标准化接口文档。该设计可同时满足对内给第三方提供API、对外调用外部平台API两套场景兼顾安全性、稳定性、可维护性与接入友好度。