前端后端接口那些事吐槽

今天与另一位前端开发人员扯起了后端接口的皮(我也是前端人员),那个兄弟对后端人员提供的接口很大的意见(我是司空见惯),不过他说的也确实有道理,所以结合我的见解,希望提供接口的人员能多加注意。

1.没有文档...

例如新的前端人员到了一个新的公司,使用接口时,问这个这个不知道,问那个那个不知道,要文档没文档,这绝对是前端人员最抓狂的事,心里肯定是一千只草泥马奔腾而过。

为什么要文档?

1. 文档是当前开发者甚至后面的接盘侠(后面开发者)能够清晰往下做的指引。

2. 即便是简单的东西,但如果不写文档,以后口口相传消耗的工作量会比写文档更多。

3. 好记性不如烂笔头,一段时候后,可能连开发者都忘记接口的用途。

文档怎么写?

1. 在线文档。

在线文档易于更新和他人查看,例如可以使用Swagger编写接口文档。

PS:Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。

2. 本地文档。

本地文档一般用Word文档,但是比较不易传播,但能离线查看。

Final~

文档是及其关键的,无论是在线文档还是本地文档,有是关键。虽然写文档是麻烦的事,但对后端人员来说,是利人利己。

2.文档不全...

额,就是有了文档,文档里面对接口的描述也可能不全,可能缺每个参数详尽描述(取值范围、类型)、请求方式(GET、POST、PUT、DELETE)、返回数据的所有状态等等。这里面可能最缺就是返回数据的状态!

一般的返回数据结构~

公司的数据接口返回结构是

复制代码

{s : 0/ 1,     //表示此操作的处理状态( status ),一般简单的成功 /不成功,使用 1/0 表示。m : 'xxxx',  //表示此操作的提示信息( message ),一般只用来显示操作失败时提示信息。r : [],  //表示此操作的返回值( result )count : x  //返回的数据条数
}

复制代码

这种数据结构看起来没问题,确实也没大问题,问题就是出在s这个字段。有许多的接口不仅仅只有两种状态,成功状态只有一种倒是没问题,问题就出在失败状态,失败可能有很多情况,一个简单的s:0不能说明失败的原因(即便是有m提示信息,但用这个来区分很不靠谱,因为提示可能会变化),我们不总是仅拿m做显示用。

升级返回数据结构~

那位同事建议以下方式应答

复制代码

{s : 0/ 1/ 2/ 3,     // 0代表正常,1是参数有误,2是用户不存在,3是用户没权限等等m : 'xxxx',  //表示此操作的提示信息( message ),一般只用来显示操作失败时提示信息。r : [],  //表示此操作的返回值( result )count : x  //返回的数据条数
}

复制代码

m、r、count 可以保持不变,但是s里面必须包含所有返回状态,代表这个接口所有业务的情况,前端开发人员也就能针对每种情况进行处理。

Final~

文档最重要的部分是返回值的状态,我也建议上面的升级返回数据结构,这样就不存在任何不明朗情况。既然写了文档,就把文档写好,写明朗,这也是利人利己地方。

3.接口参数没校验...

这个前端人员倒不是很关注,因为本身调接口之前都会先做校验,后端做参数校验只是双重保证。我之前也做过一段时间后端,也犯过没校验参数的错,额,因为后来没有做后端,也就没有去修正。不过还是提醒后端人员,做好参数校验是第一步,不要偷懒了。

Final~

统一处理好接口校验,后端好好考虑下。

4.没保证接口原子性...

接口的原子性很重要,有时一个接口可能会干几件事,但不一定都能正常完成,这就导致可能存在原子性问题,接口不能准确被调用。

PS:原子性。一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。

Final~

原子性一定要保证,保证,保证!

5.接口问题不断...

前端开发人员调接口时候,可能会存在各自各样的问题,有问题可以理解,程序哪会没有bug,但不能太离谱啊,后端兄弟们。所以我觉得在给出接口之前自己明确几件事:

1. 是否校验参数。

2. 是否所有的情况都测试过了,如果可以请写单元测试。

3. 是否返回数据准确明朗,响应状态码是否正常。

4. 文档是否已经完备。

 

总结

后端人员多体谅前端人员,在出现问题时,先检查自身,别一上来就跟前端干起来,要是自己的问题就尴尬了。


本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

转载自https://www.cnblogs.com/lovesong/archive/2016/05/26/5533149.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-boot项目打war包并部署到本地的tomcat容器

一、修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二、移除springboot内嵌入式tomcat插件 在pom.xml里找到spring-boot-starter-web依赖节点&#xff0c;在其中添加如下代码&#xff1a; <dependency><groupId>org.springframework…

intellij idea 如何将普通项目转换为maven项目

1.工程文件下找到文件pom.xml&#xff0c;如果没有&#xff0c;则新建一个并填写好内容。 2.在pom.xml 文件上右键 Add as Maven Project。 3.OK,等待IDEA帮你完成剩余的工作即可&#xff0c;一个maven项目即将诞生&#xff01;

jquery特效(6)—判断复选框是否选中进行答题提示

前面有一段时间思想开了小差&#xff0c;跟着师父学习了一段时间才发现差距很大&#xff0c;看来我要奋起直追~\(≧▽≦)/~啦啦啦。 最近公司在做一个项目&#xff0c;需要根据用户选择的选项给出相应的提示&#xff0c;下面来看我写的测试程序的效果&#xff1a; 一、实现的原…

前端学习(1701):前端系列javascript之闭包

function create() {const a 100return function() {console.log(a);} } const fn create() const a 200; fn() //100function print(fn) {let a 200;fn(); } let a 100function fn() {console.log(a) } print(fn)//100

hdu 3652 B-number 数位dp

题目链接 求出1-n中包含13并且能被13整除的数的个数 开一个四维数组dp[i][j][k][l]&#xff0c; i表示第i位&#xff0c; j表示这个数mod13&#xff0c; k表示是否包含13&#xff0c; l表示前一位是什么。 1 #include<bits/stdc.h>2 using namespace std;3 #define pb(x)…

MySQL之表结构设计

Schema设计原则 &#xff1a; 更小的数据类型&#xff0c;根据估计选择不会超过范围的最小数据类型。简单数据类型的操作通常需要更少的CPU周期。例如整型比字符操作代价更低&#xff0c;因为字符集和校对规则&#xff08;排序规则&#xff09;使字符比较比整型比较更复杂。 尽…

iOS8:把这些七招APP哭

6月3日。苹果发布了新一代的高配置手机操作系统iOS 8&#xff0c;我们看到了很多新的功能和引人注目的新变化。它为开发人员提供了许多其他更酷能力发展。第三方输入法也开放&#xff0c;这使得国内的百度、搜狗输入法是不过高兴的尖叫&#xff0c;但IOS8是弄哭了一大拨APP。以…

前端学习(1703):前端系列javascript之问题解答

function fn1(a, b) {console.log(this, this)console.log(a, b)return this is fn1 } const fn2 fn1.bind({ x: 100 }, 10, 20, 30); const res fn2(); console.log(res);//模拟bind Function.prototype.bind1 function() {const args Array.prototype.slice.call(argumen…

MySQL表结构设计之范式化和反范式化对比

优点 缺点 范式 1、范式化的更新操作通常比反范式化要快&#xff0c;只需要修改较少数据。 2、范式化的表通常更小&#xff0c;可以更好地放在内存里&#xff0c;所以执行操作会更快。 复杂的查询语句在符合范式的schema上都可能需要至少一次关联&#xff0c;关联表的代价昂…

11.粘性控件

粘性控件 &#xff08;对View的自定义&#xff09;* 应用场景: 未读提醒的清除* 功能实现:> 1. 画静态图 OK> 2. 把静态的数值变成变量(计算得到真实的变量) OK > 3. 不断地修改变量, 重绘界面, 动起来了.> 4. 功能分析:a. 拖拽超出范围,断开, 松手, 消失b. 拖拽超…

前端学习(1704):前端系列javascript之问题解答2和总结

//闭包隐藏数据 function createCache() {const data {} //闭包中的数据 被访问 不被外界访问return {set: function(key, val) {data[key] val},get: function(key) {return data[key];}} } const c createCache(); c.set(a, 100); console.log(c.get(a)); 弹出1,2,3&…

高性能索引设计

索引的优点 减少了服务器需要扫描的数据量帮助服务器避免排序和临时表将随机I/O变成顺序I/O 索引的类型 B-Tree索引 B-TREE通常就意味着里面存储的所有值都是有序的&#xff0c;并且查询的时候&#xff0c;不用全表扫描&#xff0c;而是按照索引结构查找&#xff0c;所以会更…

posix thread线程

1. pthread线程通过调用你提供的某些函数开始。这个“线程函数”应该只有一个void*型参数&#xff0c;并返回系统的类型。2. 通过向pthread_create函数传递线程函数的地址和线程函数调用的参数来参加线程。3. 线程可以通过pthread_self获取自己的ID。4. 除非线程的创建者或者线…

MySQL查询语句优化

慢查询原因 1 从数据库请求不需要的数据 例如业务只需要返回指定的列&#xff0c;sql查询全部列&#xff0c;或者多表关联返回全部列。某些相同数据被重查询多次&#xff0c;可以结合实际业务在初次查询后进行缓存&#xff0c;需要时候从缓存中取出 2 扫描额外的记录行 2 解…

python之装饰器详解

这几天翻看python语法&#xff0c;看到装饰器这里着实卡了一阵&#xff0c;最初认为也就是个函数指针的用法&#xff0c;但仔细研究后发现&#xff0c;不止这么简单。 首先很多资料将装饰器定义为AOP的范畴&#xff0c;也就是Aspect Oriented Programming面向切面编程的概念&am…