15_移动端项目或者前后端分离项目接口规范

news2024/12/23 12:18:09

15_移动端项目或者前后端分离项目接口规范

写在前面的话,主要是谈谈接口

随着前后端的分离,后端工程师不需要编写页面,甚至不需要编写JavaScript代码,只需要提供接口给前端工程师即可,可是就是仅仅一个接口,对于很多后端工程师而言,在实际开发中,不能一次成形,导致前端工程师们对接接口的过程中,依然问题重重,很多后端同事认为,我在接口里面只需要把数据返回给前台,其他我一概不管,这样造成的后果就是

1、接口结构无序、杂乱无章
2、接口和实际业务场景、UI或者原型不匹配、不可用、等于白写、浪费时间
3、前端同事在接口对接过程中频繁的与后端同事沟通接口问题,严重的甚至需要多次沟通才能得到一个完整无误的接口,最终导致简单的问题复杂化了,前后端都很恼火
4、事情没做好

后端在编写接口前,首先是对项目整体业务的理解,在对业务未理解透彻之前,编码都是无意义的,其次就是,后端的同事在编写一个接口之前,应该先结合下已有的UI或者原型分析,如果说发现UI或者原型与现有业务不匹配的情况下,那么应该主动找到设计师以及前端的同事沟通处理,沟通才是第一位,有的时候沟通往往比技术更重要,这在团队合作开发项目的过程中尤为重要.

后端在开发接口时,我觉得主要需要注意以下几个方面:

接口请求方式

接口传参

全局错误码定义

接口返回json格式约定

接口文档编写

下面我将围绕这几个方面逐一展开说明,注:以下内容中红色字体标明的内容是后端同事必须遵守的规范,也是开发过程中不应该出现的低级错误.

接口请求方式

关于接口请求方式,目前比较常用的有:GET、POST、PUT、DELETE,对应数据库的增、删、改、查操作

GET(SELECT):从服务器查询资源(一项或多项)。

POST(CREATE):在服务器新建一个资源。

PUT(UPDATE):在服务器端更新资源(客户端提供改变后的完整资源)

DELETE(DELETE):从服务器删除资源

由于公安部在做网络安全漏洞扫描时,会把PUT、DELETE请求(除GET和POST之外的接口请求)识别成漏洞,所以,后端同事在开发接口时,请尽量保证只使用GET、POST这两种请求方式.

接口入参规范

1、get请求只支持query形式的参数,不能传递数据量很大的参数
${serverUrl}/app/api/login?loginId=xxx&passwd=xxx
2、post请求分为postForm和postJson两种传参方式

postForm:postForm在B端表单提交比较常用

postJson:在客户端可以直接传递一个序列化的实体到服务器,非常方便,并且不容易出现中文乱码的错误

  • postForm
@FormUrlEncoded
@POST
Observable<RawResponse> postForm(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> queryParams, @FieldMap Map<String, Object> fieldMap);

2022-11-04 09:52:35.758 20660-20698/com.aykj.mall D/OkHttp: --> POST https://www.wanandroid.com/app/api/login http/1.1
2022-11-04 09:52:35.758 20660-20698/com.aykj.mall D/OkHttp: Content-Type: application/x-www-form-urlencoded
2022-11-04 09:52:35.768 20660-20698/com.aykj.mall D/OkHttp: Content-Length: 22
2022-11-04 09:52:35.768 20660-20698/com.aykj.mall D/OkHttp: isDowload: false
2022-11-04 09:52:35.768 20660-20698/com.aykj.mall D/OkHttp: isUpload: false
2022-11-04 09:52:35.768 20660-20698/com.aykj.mall D/OkHttp: loginId=xxx&passwd=xxx

  • postJson

postJson会将传递的参数包装成一个JSonObject,传递给后端,所以后端可以直接用一个java实体来接收

@POST
Observable<RawResponse> post(@Url String url, @HeaderMap Map<String, Object> header, @QueryMap Map<String, Object> queryParams, @Body Object body);

2022-09-01 10:09:53.551 21155-21199/com.aykj.mall D/OkHttp: --> POST https://www.wanandroid.com/app/api/login http/1.1
2022-09-01 10:09:53.551 21155-21199/com.aykj.mall D/OkHttp: Content-Type: application/json; charset=UTF-8
2022-09-01 10:09:53.551 21155-21199/com.aykj.mall D/OkHttp: Content-Length: 32
2022-09-01 10:09:53.551 21155-21199/com.aykj.mall D/OkHttp: isDowload: false
2022-09-01 10:09:53.552 21155-21199/com.aykj.mall D/OkHttp: isUpload: false
2022-09-01 10:09:53.552 21155-21199/com.aykj.mall D/OkHttp: {“loginId”:“xxx”,“passwd”:“xxx”}

3、请勿在query参数上要求前端传递实体到后端,错误的做法,传不过去

在这里插入图片描述

上面这张图是一个反例,数据量很大的情况传不过去,这种情况请使用postJson方式,后端直接从前端接收一个实体很方便

4、接口入参一定要注释清楚,更不能没有,如查询栏目,一定要注明栏目id传值的取值情况

在这里插入图片描述

上面这张图是一个反例,这样的接口直接给到前端的话,前端很头疼😂。

全局错误码定义

{
  "code":200,
  "message":"ok",
  "result":"返回结果"
}
  • code:响应的状态码,注:这里的状态码不是服务器的http协议状态码,而是业务相关的状态码,比如接口请求成功为200,一般情况下code以2开头表示成功,不以2开头表示失败,取决于自己部门内部定的框架的规范,例如301表示用户名不能为空、302表示验证码输入错误等等…
  • message:响应的提示信息,前端会将改字段的内容作为提示信息显示给用户。
  • result: 返回给前端的业务数据,可以是实体,可以是数据,也可以是基本数据类型,取决于实际业务,后面会详细展开说明。
{
  "code":301,
  "message":"用户名不能为空",
  "result":null
}
{
  "code":302,
  "message":"验证码输入错误",
  "result":null
}

后端在编写接口时,返回的数据结构最外层一定要统一,同一个项目中,开发人员A返回的JSON结构为:{
“code”:200,
“message”:“ok”,
“result”:…
},开发人员B返回的JSON结构为:{
“statusCode”:200,
“msg”:“ok”,
“result”:…
},这样的情况禁止出现,否则后果自负

在这里插入图片描述

业务中同样的错误信息,code和message应固定或者说保证一致

在这里插入图片描述

业务中出现的状态码(code)与业务提示信息(message)应保持同一,并且一一对应

在这里插入图片描述

用户授权

前后端在开放用户授权时,以用户登录、注册为例:

后端在接受到前端提交的数据后,应该从数据库反查判断这个用户是否已经注册

1、如果反查不到这个用户,说明用户未注册,返回相应的状态码和业务提示信息,告诉前端,当前的用户未注册,前台会跳转至用户注册页面引导用户注册

2、如果反查到了这个用户,说明用户已注册,那么此时应该走登录的流程,后端需要使用反查到的用户信息通过JwtToken生成一个token以约定好的json数据格式返回给前端,前端会以此token作为用户登录态的数据持久化

3、最后后端编写其他业务接口时,所有涉及到登录拦截的地方,前端会将缓存起来的token,传递给后端,后端通过校验改token是否有效,以及解析该token,反查数据库判断用户是否已注册,来实现登录拦截

4、后端在编写接口时,如果希望前端标识当前用户信息,那么前端同样会将缓存起来的token传递给后端,后端通过解析这个token来确定当前请求接口的用户是谁,而不应该让前端传递明文的userId等信息给后端,如果解析token失败,那么就说明用户的登录态失效了,此时就要重新走登录或者注册的流程,也就是登录拦截

在这里插入图片描述

接口json格式规范

1、json格式需固定

例如如下图形

在这里插入图片描述

如上图所示,横向是时间,纵向是温度的value值

我们给出的json结构应该如此:

{
	"code": 200,
	"message": "请求成功",
	"result": [
      {
          "time":"2022-05-17 05:39",
          "value":10
      },
      {
          "date":"2022-05-17 06:42",
          "value":8
      }
      //more...
  ]
}

在工作中,我们经常碰见这样的数据格式:

{
	"code": 200,
	"message": "请求成功",
	"result": [
      "2022-05-17 05:39":{
      	value:10
      },
      "2022-05-17 06:42":{
      	value:8
      }
      //more...
  ]
}

这里所说的json格式固定主要针对此种情况,后端给到前端的接口格式必须是固定的,所有动态数据值都需相应的key与之对应

2、需要顺序显示的内容返回值为中文key:value 的对象。这个结构没有索引没有顺序,且中文key这种低级的不符合前后端规范的错误希望能够规避。这种数据前端处理很复杂影响性能,代码不必要的逻辑增加,代码冗余。
{
	"code": 200,
	"message": "请求成功",
	"result": {
    "结题": "2022-12-15",
		"初期": "2022-10-01",
		"中期": "2022-11-01",
		"开题": "2022-11-15",
	}
}

像这种有多个内容,且有顺序的数组应返回结构如下

{
	"code": 200,
	"message": "请求成功",
	"result": [
		{
			"name": "初期",
			"value": "2022-10-01"
		},
		{
			"name": "中期",
			"value": "2022-11-01"
		},
		{
			"name": "开题",
			"value": "2022-11-15"
		},
		{
			"name": "结题",
			"value": "2022-12-15"
		}
	]
}

贴上前端处理的代码,这些不必要的逻辑代码都可以省略的。

let data = jsonData.result
let stepArr = []
for(let key in data) {
	stepArr.push({
		"name": key,
		"value": stepArr[key]
	})
}
//...
stepArr.sort()
3、返回json数据本身是一个数据或者对象,转成该结构再返回,避免直接返回字符串等前端处理
{
  "code": 200,
	"message": "请求成功",
	"result": {
		"seoTitle": "云玺大宅别墅轻奢装修效果图",
		"seoDescription": "云玺大宅别墅轻奢装修效果图",
		"searchOptionRoot": "69,70,71",
		"brandImagesPath": "[{\"ext\":\"jpg\",\"fileName\":\"dDf7E2LRQ6eAavlYAAGaTQsy5y0442.jpg\",\"fileSize2\":\"108KB\",\"sysCompanyCode\":\"A01\",\"path\":\"group1/M00/1D/99/dDf7E2NgtayAWajhAAGvY9nTaaQ531.jpg\",\"createBy\":\"zhaomin\",\"fileSize\":108,\"enable\":1,\"sysOrgCode\":\"A01A14A06\",\"id\":\"ff808081841de9db018431cf8af40437\",\"contentType\":\"image/jpeg\",\"createName\":\"赵敏\",\"createDate\":1667282995000}]",
		"brandLogoPath": "[{\"ext\":\"jpg\",\"fileName\":\"dDf7E2LQv3KANrzNAAIaT7BPDf0412.jpg\",\"fileSize2\":\"156KB\",\"sysCompanyCode\":\"A01\",\"path\":\"group1/M00/1D/99/dDf7E2NgtWaABhy8AAJsfhZXSYA050.jpg\",\"createBy\":\"zhaomin\",\"fileSize\":156,\"enable\":1,\"sysOrgCode\":\"A01A14A06\",\"id\":\"ff808081841de9db018431ce78cf0436\",\"contentType\":\"image/jpeg\",\"createName\":\"赵敏\",\"createDate\":1667282925000}]",
	}
}

上面的json结构中,主要看brandImagesPath和brandLogoPath这两个字段,对象数组直接返回了字符串

let brandImages = res && res.brandImagesPath ? JSON.parse(res.brandImagesPath):[]
let brandLogos = res && res.brandLogoPath ? JSON.parse(res.brandLogoPath):[]

前端现在需自己转成需要的格式,多此一举,这点简单东西后端应该处理好再返回。

4、后端在改接口或者业务有变动的时候 可以在原有实体的基础上扩展属性 但是不要改实体里面原有的属性 也不要改整个json数据的结构 不然前端已经绑定好的页面也出错了

举个例子说明

{
  "code": 200,
	"message": "请求成功",
	"result": {
		"permitId": 123456
	}
}

前端已经有一个1.0版本上线并正常使用了,项目迭代到2.0版本,permitId需要返回多个值给前端处理,后端二话不说直接把接口中permitId的结构改成了数组:

{
  "code": 200,
	"message": "请求成功",
	"result": {
		"permitId": [123456, 789000]
	}
}

这样粗暴的修改,就会导致线上1.0版本出现错误,正确的做法应该是在原有基础上扩展一个字段,这样就可以保证在扩展2.0版本业务的同时,1.0线上版本能够正常运行:

{
  "code": 200,
	"message": "请求成功",
	"result": {
		"permitId": 123456,
    "permitIds":[123456, 789000]
	}
}

接口文档编写

接口文档是前后端对接重要依据,后端写明接口文档,前端根据接口文档对接。

接口文档需注明字段对应页面内容。不写接口文档的坏处:

第一:前后端开发没有标准,没有依据。

第二:容易扯皮,没法追踪,职责不清。

第三:开发效率低。等等。

文档形势目前主要分几种:

1、依赖swagger框架,自动生成接口文档(swagger只能生成基于key-value详细参数方式,针对json格式,无法说明具体请求内容)

2、使用Knife4j,也就是swagger的升级版

3、手动编写说明文档,推荐markdown编写

接口对接

万事俱备,只欠东风,虽然上面我们准备了所有我们该准备的,接口定义完美无缺,接口文档也已说明,但在对接时任然可能出现问题,此时我想我们还需注意细节,那就是后端接口需自行进行测试,推荐使用PostMan进行测试,作为接口调试神器,Postman大名想必大家都已知道,就不多说了。

前后端需心平气和沟通,勿推卸责任,前后端开发人员水平不尽相同,作为同事,需要的是团结合作,努力将事情做好,而非相互推卸责任

最后希望项目能够越做越好,公司蒸蒸日上

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

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

相关文章

mybatis-plus自带的乐观锁

文章目录1.场景1.1.模拟冲突2.添加乐观锁2.1数据库添加字段2.2配置文件中增加乐观锁拦截器2.3类的属性上添加注解2.4再次运行测试文件3.优化流程mysbatis-plus乐观锁原理&#xff1a;mysbatis-plus进行修改操作时&#xff0c;会将数据库中version字段的值拿出来和上一个查询时的…

大一学生WEB前端静态网页——旅游网页设计与实现-张家口 6页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作| HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作方面上运…

【电力负荷预测】模拟退火算法结合狮群算法优化Elman神经网络电力负荷预测【含Matlab源码 1454期】

⛄一、模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing&#xff0c;SA)的思想最早由Metropolis等人于1953年提出&#xff1a;Kirkpatrick于1983年第一次使用模拟退火算法求解组合最优化问题[1] 。模拟退火算法是一种基于MonteCarlo迭代求解策略的随机寻优算法&…

图文详解Linux基础经典教程(09)——部署项目至CentOS

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 在之前的操作里&#xff0c;我们在CentOS中安装了JDK、Tomcat、MySQL。接下来&#xff0c;我们需要将JavaWeb项目部署至CentOS。 项目开发 请在IDEA中开发JavaWeb项…

SpringBoot SpringBoot 开发实用篇 6 监控 6.3 actuator

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.3 actuator6.3.1 actuator6.3.2 监控原理6.3.3 小结6 监控 …

Win10下安装CARLA

在仿真环境中要使用lidar进行测试&#xff0c;目前prescan和matlab的lidar扫描方式无法设置&#xff0c;而CARLA中lidar是机械扫描形式&#xff0c;符合需求故选择该软件&#xff0c;只是测试不想重装系统&#xff0c;便在win10下进行安装测试。 1. 安装前需要安装的软件 1. …

小白必看 最核心的5大TikTok视频营销策略(附赠工具)

数据显示&#xff0c;TikTok的用户月人均使用时长达到了每月23.6小时&#xff0c;超过了YouTube的23.2小时。TikTok的用户支出在2022年第一季度达到了8.4亿美元&#xff0c;迄今为止其用户支出总额已超过46亿美元。可见&#xff0c;Tiktok是目前发展相对较好的的短视频社交媒体…

网页JS自动化脚本(一)安装油猴或暴力猴等脚本管理器并新建脚本

在我们的工作生活当中使用网页的机会越来越高,很多时候要进行重复的操作,所以进行一些JS脚本就成了可选项首先我们要在网页浏览器中安装上脚本管理器,这里示范的是安装暴力猴,是一个开源的免费的小软件,是在github上的一款软件,下载下来之后名称为Violentmonkey_2.13.0_chrome.…

Node与浏览器平台下的Event loop

Event loop 浏览器中的Event loop 浏览器平台下一共有两个任务队列&#xff0c;一个是宏任务一个是微任务。 从上至下执行所有的同步代码执行过程中将遇到的宏任务与微任务添加至相应的队列同步代码执行完毕后&#xff0c;执行满足条件的微任务回调微任务队列执行完毕后执行…

C# 加解密之AES

从这一篇开始呢&#xff0c;写一下常用的一些加解密方式。一般我们来说呢&#xff0c;对于加密&#xff0c;我们分为可逆和不可逆。可逆加密又可分为对称加密&#xff08;AES、DES等&#xff09;和非对称加密&#xff08;RSA&#xff09;&#xff0c;还有就是一些编码加密等&am…

适用于C/C++开发人员的HOOPS

1.编译和运行时信息 1.1编制和执行 编译和运行基于C的应用程序需要以下步骤&#xff1a; 编译&#xff1a; 所有3DGS应用: hoops.lib 使用HOOPS/MVO的应用: hoops_mvo.lib 使用HOOPS/Stream的应用: hoops_stream.lib 执行&#xff1a;确保以下本地DLL位于应用程序的目录或…

学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

MCE | 癌症诊断和靶向治疗的“遍地开花”

据研究报道&#xff0c;很多癌细胞分泌的外泌体 (Exosome) 比正常细胞分泌的多 10 倍以上。外泌体参与了癌症的发生、进展、转移和耐药性&#xff0c;并通过转运蛋白和核酸&#xff0c;建立与肿瘤微环境的联系。例如&#xff0c;外泌体可导致免疫逃逸&#xff0c;癌细胞的免疫逃…

java 云MAS业务平台_中国移动

云MAS业务平台_中国移动http://mas.10086.cn/login 首页可下载不同协议的接口对接文档,这里以https为例 接口报文数据结构 连接地址:https://:/sms/submit 请求方式:post 数据类型:json(base64加密) A:请求报文内容(一对一或多对一模式*注1): 名称类型说明ecNameSt…

企业年会直播来个虚拟舞台场景如何?

阿酷TONY / 2022-11-21 / 长沙 绿幕抠像 虚拟场景&#xff08;三维场景&#xff09;实时渲染&#xff0c;降低直播成本&#xff0c;带来线下活动所没有的沉浸式视听体验&#xff0c;来吧&#xff0c;来一场精彩纷呈的虚拟年会直播吧。 目录 1. 绿幕虚拟直播间 2. 虚拟场景(…

html实现爱情浪漫表白甜蜜时刻(附源码)

文章目录1.设计来源1.1 主界面1.2 相识界面1.3 相知界面1.4 相爱界面2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128006618 html实现爱情浪漫表白甜蜜时刻(附源码) html爱…

web前端课程设计——重庆旅游7页 HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

数据结构 | 栈和队列

… &#x1f4d8;&#x1f4d6;&#x1f4c3;本文已收录至&#xff1a;数据结构 | C语言 更多知识尽在此专栏中!文章目录&#x1f4d8;前言&#x1f4d8;正文&#x1f4d6;栈&#x1f4c3;结构&#x1f4c3;初始化&#x1f4c3;销毁&#x1f4c3;入栈、出栈&#x1f4c3;查看栈…

化工机械基础试题及答案

一、 名词解释&#xff08;10分&#xff09; 1、无力矩理论&#xff1a;在旋转薄壳的受力分析中忽略了弯矩的作用&#xff0c;该情况下的应力状态和承受内压的薄膜相似&#xff0c;又称薄膜理论。 2、法兰的公称压力&#xff1a;以16MnR在200℃时的力学性能为基础&#xff0c;其…

力扣刷题(代码回忆录)——动态规划

关于动态规划&#xff0c;你该了解这些&#xff01;动态规划&#xff1a;斐波那契数动态规划&#xff1a;爬楼梯动态规划&#xff1a;使用最小花费爬楼梯本周小结&#xff01;&#xff08;动态规划系列一&#xff09;动态规划&#xff1a;不同路径动态规划&#xff1a;不同路径…