python后端接口怎么写_看看人家那后端API接口写得,那叫一个优雅!
程序员的成长之路
互联网/程序员/技术/资料共享
阅读本文大概需要 4 分钟。
来自:今日头条,作者:老顾聊技术
链接:https://www.toutiao.com/i6694404645827117572
前言
在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。
一般系统的大致整体架构图如下:
需要说明的是,有些小伙伴会回复说,
这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。
因为老顾这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。
接口交互
前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。
针对
URL路径的restful风格,以及传入参数的
公共请求头的要求(如:app_version,api_version,device等),老顾这里就不介绍了,小伙伴们可以自行去了解,也比较简单。
着重介绍一下后端服务器如何实现把数据返回给前端?
返回格式
后端返回给前端我们一般用JSON体方式,定义如下:
{
#返回状态码
code:integer,
#返回信息描述
message:
string,
#返回值
data:
object
}
CODE状态码
code返回状态码,一般小伙伴们是在开发的时候需要什么,就添加什么。
如接口要返回用户权限异常,我们加一个状态码为101吧,下一次又要加一个数据参数异常,就加一个102的状态码。这样虽然能够照常满足业务,但状态码太凌乱了
我们应该可以参考HTTP请求返回的状态码
:下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
我们可以参考这样的设计,这样的好处就把错误类型归类到某个区间内,如果区间不够,可以设计成4位数。
#1000~1999 区间表示参数错误
#2000~2999 区间表示用户错误
#3000~3999 区间表示接口异常
这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据message相关的信息描述,可以快速定位。
Message
这个字段相对理解比较简单,就是发生错误时,如何友好的进行提示。一般的设计是和code状态码一起设计,如
再在枚举中定义,状态码
状态码和信息就会一一对应,比较好维护。
Data
返回数据体,JSON格式,根据不同的业务又不同的JSON体。
我们要设计一个返回体类Result
控制层Controller
我们会在controller层处理业务请求,并返回给前端,以order订单为例
我们看到在获得order对象之后,我们是用的Result构造方法进行包装赋值,然后进行返回。小伙伴们有没有发现,构造方法这样的包装是不是很麻烦,我们可以优化一下。
美观优化
我们可以在Result类中,加入静态方法,一看就懂
那我们来改造一下Controller
代码是不是比较简洁了,也美观了。
优雅优化
上面我们看到在Result类中增加了静态方法,使得业务处理代码简洁了。但小伙伴们有没有发现这样有几个问题:
1、每个方法的返回都是Result封装对象,没有业务含义
2、在业务代码中,成功的时候我们调用Result.success,异常错误调用Result.failure。是不是很多余
3、上面的代码,判断id是否为null,其实我们可以使用hibernate validate做校验,没有必要在方法体中做判断。
我们最好的方式直接返回真实业务对象,最好不要改变之前的业务方式,如下图。
这个和我们平时的代码是一样的,非常直观,直接返回order对象,这样是不是很完美。那实现方案是什么呢?
实现方案
小伙伴们怎么去实现是不是有点思路,在这个过程中,我们需要做几个事情:
1、定义一个注解@ResponseResult,表示这个接口返回的值需要包装一下
2、拦截请求,判断此请求是否需要被@ResponseResult注解
3、核心步骤就是实现接口ResponseBodyAdvice和@ControllerAdvice,判断是否需要包装返回值,如果需要,就把Controller接口的返回值进行重写。
注解类
用来标记方法的返回值,是否需要包装
拦截器
拦截请求,是否此请求返回的值需要包装,其实就是运行的时候,解析@ResponseResult注解
此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。
重写返回体
上面代码就是判断是否需要返回值包装,如果需要就直接包装。这里我们只处理了正常成功的包装,如果方法体报异常怎么办?处理异常也比较简单,只要判断body是否为异常类。
怎么做全局的异常处理,篇幅原因,老顾这里就不做介绍了,只要思路理清楚了,自行改造就行。
重写Controller
在控制器类上或者方法体上加上@ResponseResult注解,这样就ok了,简单吧。到此返回的设计思路完成,是不是又简洁,又优雅。
总结
这个方案还有没有别的优化空间,当然是有的。如:每次请求都要反射一下,获取请求的方法是否需要包装,其实可以做个缓存,不需要每次都需要解析。当然整体思路了解,小伙伴们就可以在此基础上面自行扩展。
新福利
柒哥给读者大大们搞一波福利,往后推文会有几率送包邮送实体书一本!!!
送书要求:
1、将本公众号设为星标,并右下角点击在看
2、以如下格式写留言才能参与:每天的书名 + 和书相关的走心留言(20字以上)。
3、每次选取留言点赞最多的送。
4、本次截止时间:2020.11.05 24:00
5、为了大家都有机会,每个小伙伴每 30 天限中奖一次
推荐阅读:
5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「2048」,即可免费获取!!
微信扫描二维码,关注我的公众号
朕已阅
python后端接口怎么写_看看人家那后端API接口写得,那叫一个优雅!相关推荐
- python使用suds访问用.net开发的webservice的API接口
背景: 这个是中东一个快递公司的api接口,背景就是要调用该公司的api接口,查询快递的物流信息,由于它是使用webservice的方式访问,所以特此记录一下 笔者是使用python3.6 安装: p ...
- java获取api接口新浪数据,新浪短网址API接口的获取以及API接口的调用文档分享...
我们可能会收到类似于这样的短信,发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实现长链接 ...
- 京东整店商品查询API接口(item_search_shop-获得店铺的所有商品API接口)
可以通过京东整店商品列表接口采集店铺所有商品详情页各项数据,包含商品标题,skuid.价格.优惠价,收藏数.月销售量.SKU图.标题.详情页图片等页面上有的数据均可以拿到,大家都知道,京东的反爬虫机制 ...
- 淘宝商品评价api接口(item_review-获得淘宝商品评论API接口),天猫商品评论API接口
淘宝商品评价api接口(item_review-获得淘宝商品评论API接口),天猫商品评论API接口可通过商品id,获取商品评价信息.评价内容.买家秀图片.评论浏览量.评价视频.评价追评等页面上的数据 ...
- 京东店铺的所有商品API接口(item_search_shop-获得店铺的所有商品API接口),整店商品API接口
可以通过京东店铺的所有商品API接口采集店铺所有商品详情页各项数据,包含商品标题,SKU信息.价格.优惠价,收藏数.销量.SKU图.标题.详情页图片等页面上有的数据均可以拿到,大家都知道,京东的反爬虫 ...
- 最新最全的免费股票数据接口--沪深A股基础列表数据API接口(三)
沪深A股基础实时数据API 数据来源:麦蕊智数 请求方式:Get(直接在浏览器打开就可以看到返回的数据) 数据格式:标准Json格式[{},...{}] 数据时效:实时更新 API说明文档:https ...
- java写接口给前端_看看人家那后端API接口写得,那叫一个优雅!
来源: r6d.cn/tEvn 在移动互联网,分布式.微服务盛行的今天,现在 项目绝大部分都采用的微服务框架,前后端分离方式 ,(题外话: 前后端的工作职责越来越明确 ,现在的前端都称之为 大前端 , ...
- python后端还是数据分析好_数据分析和web后端选哪个 知乎
数据分析和web后端选哪个 知乎以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据分析和web后端选哪个 知乎 WEB ...
- python简历项目经验怎么写_个人简历中工作经验怎么写?
在找工作的过程中,简历的填写是一门大的学问.一份好的简历,能够让面试官,有种迫不及待想要见你的冲动,这样也才能够让你在众多求职者中脱颖而出. 很多人在填写简历中工作经验一栏时候,会出现犯难的情况.可能 ...
最新文章
- Firefox 的User Agent 将移除 CPU 架构信息
- setTimeOut()和setInterval()的用法
- Modelsim仿真查看内部信号
- .net c# 正则表达式 平衡组/递归匹配
- Android 自定义百分比视图
- OCP12C题库,62数据库备份与恢复(admin,install and upgrade accelerated, backup and recovery workshop -62)(新增)
- 高频面试题:如何保证缓存与数据库的双写一致性?
- 洛谷 1351 联合权值——树形dp
- 64位Ubuntu kylin 16.04下使用DNW下载uboot到tiny4412的EMMC
- 前端工程师能力评估测试题(2020最新版附答案及解析)
- LMSn没有运行在RT (real time) 模式Oracle 19c RAC?
- 【金融申请评分卡】数据准备 - 缺失值数据清洗
- Docker Swarm架构、特性与基本实践
- 分布式、微服务与集群的区别
- Python玩转emoji表情 一行代码的事儿!
- 软件安全测试培训大纲
- 计算机运行但屏幕黑屏,电脑显示器黑屏,教您电脑主机运行正常显示器黑屏怎么办...
- 网络信息安全之防火墙入反病毒技术 (七)
- RocksDB原理介绍
- 关于C语言的优秀文章
热门文章
- 半路学编程,可以成为大牛吗?
- 培训机构还能不能信任?
- 正则表达式与html信息提取,基于正则表达式的HTML信息提取.pdf
- linux修改目录为nobody,nfs只能挂载为nobody的解决方法
- 富文本_轻量级 web 富文本编辑器 —— wangEditor
- Nature | 我的研究对后人毫无用途:21%的学术论文自发布后从未被引用
- 生信分析过程中这些常见文件的格式以及查看方式你都知道吗?
- motionVFX mRevealer Glitch Mac(fcpx插件:30个故障干扰马赛克毛刺失真特效)
- 动画学信奥 漫画学算法 CSP-J入门级 (一)、计算机基础与编程环境(依据「NOI大纲」)
- 提高篇 第三部分 图论 第1章 最小生成树