码农架构 | 如何设计出优雅且实用的 API 接口

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 互联网工程的高速发展,分布式、微服务、容器化架构的流行,互联网已全面进入云原生时代。构建系统的方式由最初的单体大应用演变为分布式架构,不以规矩,不能成方圆。只有我们不断地去优化才会创造出更好的产品

记得最开始的时候在设计接口的时候规范还没有那么多,因为前后端还没分离。不管是前端还是后端都是一个人开发,为了追求"效率"。所谓的接口规范百花齐放,各有各自的一套。后来前后端分离,哪些为了追求"效率"而写的代码,重构起来的代码也是头疼。

所以到了现在已经基本固定基本的机构体系,针对业务得不同还可以垂直拓展。

如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是看是否规范!

在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过滤和接口组合等诸多因素。

本文主要针对接口返回参数结合一些网上的案例比较和思考,来讲述接口返回参数需要怎么设计更加合理。

行业案例

简书

这可能是我看到过最差的设计,打开几个网页可以看到接口返回参数设计,简单粗暴,这里就不错过多的评论。

{
// 结果集}

掘金

看完简书再看下另外一个产品掘金,掘金相对而言会好点。至少有了明显的层次结构,包含状态码、结果集、成功或错误,但是这个命名确实让人有点误解,至少我个人看到后是这种感觉。

{
"data":"结果集",
"err_msg":"成功或错误提示",
"err_no":"状态码"}

CSDN

就论接口参数CSDN算是中规中矩的接口,接口包含了三大要素:状态码、结果集、成功或错误的的提示。

{
"code":"状态码/结果编码",
"data":"结果集/数据",
"message":"成功/错误提示"}

针对这种返回参数针对单体服务来讲算是合格的,知道每个接口的状态、对应状态的结果、针对状态如果要展示提示可以根据message对应的信息来确定。对于单体服务这种设计基本能满足要求。

InfoQ

看到InfoQ的接口返回值,让我觉得不错的一点就是有一个拓展的返回参数设计,里面有个参数cost(成本),通熟一点就是接口的耗时。

{
"code":"状态码/结果编码",
"data":"结果集/数据",
"error":"成功/错误提示",
"extra":{
"cost":"成本/耗时",
"request-id":"请求ID"  }
}

针对InfoQ的接口返回参数设计,相对上述几个产品而已确实优化了很多,尤其是针对接口做了成本/耗时统计。但是这种设计还是有点冗余,为什么这么讲呢?因为浏览器自带功能

对于request-id个人理解为当前请求线程的链路ID。在微服务体系中用于追踪服务的日志,算是一把利器。

设计优化

结合上面几个产品的接口返回参数设计,可以简单归纳接口返回参数的几个要点

在结合InfoQ和CSDN的基础上,加上了boolean类型的是接口执行是否成功的标识,当然也你也可以用状态码,但是这里做了一些的优化调整。

再思考一下一种常见国际化问题

  • 如何统一国家化提示?针对后端的一些校验异常抛出提示怎么处理国际化问题?

其实解决上诉问题国际化问题不是特别难,稍微做一下调整。

  • code 调整为:成功/错误的messageKey,由前后端统一约束国际化的key
  • msg  调整为:成功/错误的提示信息,由后端根据国际化配置转化成对应的错误信息

{
"success": true,
"code": "return.optSuccess",
"msg": "您的操作已成功!",
"data": {
// 数据    },
"extendProps":{
// 拓展   }
}


设计拓展

在基础返回信息中针对拓展的补充,其实这里的目的主要是对于开发和运维人员来补充的。

思考下如果一个接口返回了错误信息,你的第一反应是怎样的?

查看后端日志,但是日志采集信息那么多,基于什么信息去查后台服务器的日志才能快速定位问题?

为了解决日志查询难定位的场景,这里建议加上链路ID也可称为追踪ID,因此可以继续优化设计

{
"success": true,
"code": "return.optSuccess",
"msg": "您的操作已成功!",
"data": {
// 数据    },
"traceId":"1fbovmc1hwu2wc5w2n2n4gm2lmjaoo2b5dw0"}

当然并不是所有的错误都需要去查看日志,必要的时候针对一些错误,后端开发完全可以将堆栈信息缓存抛出来,例如这样

{
"success": false,
"code": "初始化发生异常!",
"traceId": "1fbqterqbwu5wiow1bjvu6214amgrd3i7cw0",
"errStacks": [
        {
"app": "base-service",
"code": "error.data.dictionary.conversion",
"message":"数据字典序列化异常"        }
    ]
}

针对接口看到堆栈信息大致可以定位到自己代码错误的位置,如果还定位不到就要通过链路ID查看后具体错误位置,因此针对接口返回参数可以继续优化

总结

互联网工程的高速发展,分布式、微服务、容器化架构的流行,互联网已全面进入云原生时代。构建系统的方式由最初的单体大应用演变为分布式架构,不以规矩,不能成方圆。只有我们不断地去优化才会创造出更好的产品。本期主要针对接口返回参数结合一些网上的案例比较和思考。

其实在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过滤和接口组合等诸多因素。后期几期会逐一分享。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
48 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
3天前
|
前端开发 API 数据库
Next 编写接口api
Next 编写接口api
|
9天前
|
XML JSON 缓存
阿里巴巴商品详情数据接口(alibaba.item_get) 丨阿里巴巴 API 实时接口指南
阿里巴巴商品详情数据接口(alibaba.item_get)允许商家通过API获取商品的详细信息,包括标题、描述、价格、销量、评价等。主要参数为商品ID(num_iid),支持多种返回数据格式,如json、xml等,便于开发者根据需求选择。使用前需注册并获得App Key与App Secret,注意遵守使用规范。
|
8天前
|
JSON API 开发者
淘宝买家秀数据接口(taobao.item_review_show)丨淘宝 API 实时接口指南
淘宝买家秀数据接口(taobao.item_review_show)可获取买家上传的图片、视频、评论等“买家秀”内容,为潜在买家提供真实参考,帮助商家优化产品和营销策略。使用前需注册开发者账号,构建请求URL并发送GET请求,解析响应数据。调用时需遵守平台规定,保护用户隐私,确保内容真实性。
|
8天前
|
搜索推荐 数据挖掘 API
淘宝天猫商品评论数据接口丨淘宝 API 实时接口指南
淘宝天猫商品评论数据接口(Taobao.item_review)提供全面的评论信息,包括文字、图片、视频评论、评分、追评等,支持实时更新和高效筛选。用户可基于此接口进行数据分析,支持情感分析、用户画像构建等,同时确保数据使用的合规性和安全性。使用步骤包括注册开发者账号、创建应用获取 API 密钥、发送 API 请求并解析返回数据。适用于电商商家、市场分析人员和消费者。
|
17天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
46 8
|
18天前
|
JSON API 开发工具
淘宝实时 API 接口丨淘宝商品详情接口(Taobao.item_get)
淘宝商品详情接口(Taobao.item_get)允许开发者获取商品的详细信息,包括基本信息、描述、卖家资料、图片、属性及销售情况等。开发者需注册账号、创建应用并获取API密钥,通过构建请求获取JSON格式数据,注意遵守平台规则,合理使用接口,确保数据准确性和时效性。
|
17天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
42 3
|
19天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
86 5
|
19天前
|
JSON 缓存 监控
淘宝商品详情接口(Taobao.item_get)丨淘宝API接口指南
淘宝商品详情接口(Taobao.item_get)允许开发者通过HTTP GET方法获取淘宝商品的详细信息,包括商品ID、价格、库存等。请求需包含key、secret、num_iid等必选参数,支持缓存及多种返回格式。此接口广泛应用于电商数据分析、商品选品、价格监控等领域,提升商家运营效率。
下一篇
DataWorks