初探APP架构之后端接口设计方案

2023-05-16

初探APP架构之后端接口设计方案

App与服务器的接口设计需要考虑很多地方,这里整理项目中遇到的和使用到的一些接口设计原则,抛砖引玉。

在这里插入图片描述

1 设计思想

APP对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所有在开发过程中尽量选择效率高的框架,对数据要求也比较严格,app需要什么数据就传什么数据,不可多传,过多的数据量影响处理速度,最重要的是影响传输效率。接口要规范,以面向对象的思想设计接口。

2 app后端和java web后端的区别

由于之前开发过安卓,现在也在开发java web 后端,所以这里总结一下。发现有的做java web 后端的同学并不太清楚。

其实对于后台开发来说原理都差不多。只不过app的后台开发和web不一样的地方在于传输数据格式不一样,一般来说web访问后返回的是一个html页面,少部分是json格式;而一般app的后台开发大部分直接传json格式数据(也有不是json格式的,看项目的选择,但一般来说都是json),少部分会直接返回html5的页面。

还有一个不同点在于登录验证和数据加密,一般web是使用session验证登录状态,而app则使用token来验证登录状态(token是自己定义的一个和用户ID相关的加密字符串,传入后台后从数据库查询用户信息)。还有如果对安全性要求较高,app传输数据时可能会对数据进行加密,而web一般没有这一步,web的加密一般是使用https。

至于说android和ios的开发环境不一样那是指的app开发,和后台无关。app的后台和java web的后台没有本质区别。app的一个后台可以即提供给android,也可以同时提供给iOS,它就是把app提交的数据处理后插入数据库和从数据库查出数据处理后传给app。

3 安全机制的设计

3.1 服务端token方式-类似session
现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。实现上,大部分都采用token的认证方式,一般流程是:

1、用户用密码登录成功后,服务器返回token给客户端;

2、客户端将token保存在本地,发起后续的相关请求时,将token发回给服务器;

3、服务器检查token的有效性,有效则返回数据,若无效,分两种情况:

token错误,这时需要用户重新登录,获取正确的token

那么这种方式的缺点就是token过期的问题,客户端用户调接口时有可能登入已经过期了,解决的办法就是接口规范了,也就是后台要返回用户登入是否过期的字段,客户端通过这个字段判断是否跳转到登入页面,再发起一次认证请求,获取新的token。

然而,此种验证方式存在一个安全性问题:当登录接口被劫持时,黑客就获取到了用户密码和token,后续则可以对该用户做任何事情了。用户只有修改密码才能夺回控制权。

如何优化呢?第一种解决方案是采用HTTPS。HTTPS在HTTP的基础上添加了SSL安全协议,自动对数据进行了压缩加密,在一定程序可以防止监听、防止劫持、防止重发,安全性可以提高很多。不过,SSL也不是绝对安全的,也存在被劫持的可能。另外,服务器对HTTPS的配置相对有点复杂,还需要到CA申请证书,而且一般还是收费的。而且,HTTPS效率也比较低。一般,只有安全要求比较高的系统才会采用HTTPS,比如银行。而大部分对安全要求没那么高的App还是采用HTTP的方式。

我们目前的做法是给每个接口都添加签名。给客户端分配一个密钥,每次请求接口时,将密钥和所有参数组合成源串,根据签名算法生成签名值,发送请求时将签名一起发送给服务器验证。类似的实现可参考OAuth1.0的签名算法。这样,黑客不知道密钥,不知道签名算法,就算拦截到登录接口,后续请求也无法成功操作。不过,因为签名算法比较麻烦,而且容易出错,只适合对内的接口。如果你们的接口属于开放的API,则不太适合这种签名认证的方式了,建议还是使用OAuth2.0的认证机制。

我们也给每个端分配一个appKey,比如Android、iOS、微信三端,每个端分别分配一个appKey和一个密钥。没有传appKey的请求将报错,传错了appKey的请求也将报错。这样,安全性方面又加多了一层防御,同时也方便对不同端做一些不同的处理策略。

3.2 客户端token方式
客户端生成token传给服务端校验,一致就通过用户验证。
通过时间戳+用户唯一标识+MD5加密=token(算法自定义),并且把时间戳传给后台,后台通 过后台系统的时间戳和客户端传过去的时间戳可以规定当前用户在1分钟内这次接口可以正常使用,也就是 说,当黑客从路由获取到连接后,只有1分钟的时间可以使用这次接口(时间后台可以自定义),这样很大程度 上确保了接口的安全性,同时,这种方式也可以有效的解决用户登入过期,也就是使用session的方式的不足,但是有个问题,如果客户端和服务端系统时间不一致,就不能这样用了,所以这个时间戳如何获取,也是一个关键点,可能通过接口从后台接口获取,也可以使用其他方式,有好的建议可以一起探讨

3.3 手机验证码登陆
现在越来越多App取消了密码登录,而采用手机号+短信验证码的登录方式,我在当前的项目中也采用了这种登录方式。这种登录方式有几种好处:
不需要注册,不需要修改密码,也不需要因为忘记密码而重置密码的操作了;
用户不再需要记住密码了,也不怕密码泄露的问题了;
相对于密码登录其安全性明显提高了。

4 接口数据的设计

接口的数据一般都采用JSON格式进行传输,不过,需要注意的是,JSON的值只有六种数据类型:

Number:整数或浮点数
String:字符串
Boolean:true 或 false
Array:数组包含在方括号[]中
Object:对象包含在大括号{}中
Null:空类型

所以,传输的数据类型不能超过这六种数据类型。以前,我们曾经试过传输Date类型,它会转为类似于"2016年1月7日 09时17分42秒 GMT+08:00"这样的字符串,这在转换时会产生问题,不同的解析库解析方式可能不同,有的可能会转乱,有的可能直接异常了。要避免出错,必须做特殊处理,自己手动去做解析。为了根除这种问题,最好的解决方案是用毫秒数表示日期。

另外,以前的项目中还出现过字符串的"true"和"false",或者字符串的数字,甚至还出现过字符串的"null",导致解析错误,尤其是"null",导致App奔溃,后来查了好久才查出来是该问题导致的。这都是因为服务端对数据没处理好,导致有些数据转为了字符串。所以,在客户端,也不能完全信任服务端传回的数据都是对的,需要对所有异常情况都做相应处理。

服务器返回的数据结构,一般为:
{ code:0, message: “success”, data: { key1: value1, key2: value2, … } }
code: 返回码,0表示成功,非0表示各种不同的错误
message: 描述信息,成功时为"success",错误时则是错误信息
data: 成功时返回的数据,类型为对象或数组

不同错误需要定义不同的返回码,属于客户端的错误和服务端的错误也要区分,比如1XX表示客户端的错误,2XX表示服务端的错误。这里举几个例子:

0:成功
100:请求错误
101:缺少appKey
102:缺少签名
103:缺少参数
200:服务器出错
201:服务不可用
202:服务器正在重启

错误信息一般有两种用途:一是客户端开发人员调试时看具体是什么错误;二是作为App错误提示直接展示给用户看。主要还是作为App错误提示,直接展示给用户看的。所以,大部分都是简短的提示信息。

data字段只在请求成功时才会有数据返回的。数据类型限定为对象或数组,当请求需要的数据为单个对象时则传回对象,当请求需要的数据是列表时,则为某个对象的数组。这里需要注意的就是,不要将data传入字符串或数字,即使请求需要的数据只有一个,比如token,那返回的data应该为:

// 正确
data: { token: 123456 }
// 错误
data: 123456

常用的HTTP状态码有:

200 OK
201 Created
204 No Content
304 Not Modified
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
410 Gone
415 Unsupported Media Type
422 Unprocessable Entity
429 Too Many Requests
500 Internal Server Error
503 Service Unavailable

5 接口版本的设计

接口不可能永远不变,它会随着需求的变化而做出相应的变动。接口的变化一般会有几种:
数据的变化,比如增加了旧版本不支持的数据类型
参数的变化,比如新增了参数
接口的废弃,不再使用该接口了
为了适应这些变化,必须得做接口版本的设计。实现上,一般有两种做法:
1.每个接口有各自的版本,一般为接口添加个version的参数。
2.整个接口系统有统一的版本,一般在URL中添加版本号,比如http://api.demo.com/v2。
大部分情况下会采用第一种方式,当某一个接口有变动时,在这个接口上叠加版本号,并兼容旧版本。App的新版本开发传参时则将传入新版本的version。
如果整个接口系统的根基都发生变动的话,比如微博API,从OAuth1.0升级到OAuth2.0,整个API都进行了升级。

有时候,一个接口的变动还会影响到其他接口,但做的时候不一定能发现。因此,最好还要有一套完善的测试机制保证每次接口变更都能测试到所有相关层面。

6 撰写接口文档

文档先行。

好的文档,和好的接口同样重要。接口文档需要被很容易地找到和访问。大部分开发者会在进行接口开发之前,检查并查看接口文档。如果这些接口文档是写在PDF文档里,或者需要登录才能查看,那将不仅仅是难于查找,还不利于搜索。

接口文档应该描述完整的 Request/Response Cycle,并附上具体的例子。最好是,这些例子应该是真实可以访问的,比如把链接复制到浏览器里执行,或者用curl执行。GitHub 和 Stripe 的接口文档都写得很不错。

一旦你发布了一个API,那意味着,在没有通知调用者的情况下,你有责任不去破坏该接口的已有功能。如果你在今后修改该接口,需要及时更新接口文档,并且在发布接口的更新之前,及时通知你的接口调用者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初探APP架构之后端接口设计方案 的相关文章

  • app开发好了你还不得不了解ASO

    前言 互联网的高速发展 带我们进入到了移动互联网时代 大家又开始了一轮APP开发的热潮 也就是移动应用开发 就像PC时代 大家都会创建自己的网站一样 现在苹果应用商店已经有上百万款的移动应用 Android的应用也有60万款左右 虽然数量上
  • vue-cordova修改app图标+文字以及启动图

    前言 在使用 vue cordova 打包成apk的时候 我们一定会根据项目改把app的图标还有显示文字 加载图片也有可能改动 这里来说一说这个 1 修改显示文字 地址 D cordova app config xml 修改name里面的文
  • android开机自启动APP及使用adb命令测试

    android开机自动运行APP实现方式其实很简单 在android系统运行时 会发出 android intent action BOOT COMPLETED 这个系统广播 因此我们监听它 并进行打开APP的操作即可 现在大多数的andr
  • emoji表情大全

    emoji表情 emoji人物 emoji手势 emoji日常 emoji手机 emoji公共 emoji动物
  • 【CSS】背景图定位问题适配不同机型

    需求 如图 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 需要适配不同的机型 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的 所以飘带和渐变背景实则两个div 飘带切图如下 圆形部分需要契合头像
  • 手机串口终端

    手机串口终端 做嵌入式开发的小伙伴永远离不开串口 想想一下 假设你需要进行现场调试 但是身边没有电脑 或者其他特殊环境不方便用电脑 或者就是单纯的懒得用电脑 该怎么办 这就是我碰到的场景 而且不止一次 说多了都是泪 别问 这种情况你就只能把
  • Poppuwindow的简单使用

    继 DialogFragment的简单使用 之后 我们再来试试 Poppuwindow 的简单使用 切记 本篇博客只能保证你入门哦 适合小白学习 效果展示 1 几个常用的构造方法 public PopupWindow Context con
  • Android APP 与STM32无线环境控制系统

    本系统为安卓APP的环境参数远程监控系统 以STM32F103单片机作为本设计的中控中心 结合物联网技术 以Android智能手机作为远程控制的客户端 通过8266 WiFi模块实现环境监控系统硬件与Android手机的交互 环境参数的反馈
  • 安装xposed(解决xposed问题)

    科学上网可轻松解决本文的问题 经过测试leidian mumu yeshen三个模拟器的最新版本只有leidian安装完成后可以重启 其他两个均会卡99 模拟器再起不能 MuMu模拟器win版 版本 2 1 3 可以 安装xposed前需关
  • flutter 图表插件之fl_chart

    前言 之前很少接触图表功能 以为图表这种功能只能在H5上才能发挥得淋漓尽致 可谁曾料想 早有大神先把强大的chart图表功能给移植到flutter端上了 而且两端都可适用 下面给出网址 pub上 https pub dev packages
  • git 解决冲突之 theirs & ours

    git merge 从feature分支合并到master分支 git checkout master git merge feature Auto merging Document CONFLICT content Merge confl
  • Fish Redux系列学习之认识view、action

    继续上一篇文章 Fish Redux系列学习之新建page以及认识state 如上图 现在我们学习的是buildview这个组件 说白了 buildView是我们写页面的地方 跟写普通flutter的page页面一样 我们将页面都写在这里面
  • 校园社区app

    此项目是面向在校大学生开发的一个集预约购物 组织活动 实事热帖于一体的社区app 前后台交互数据采用的是json数据格式 网络请求采用的是volley 后台采用mysql数据库 如果有写的不好的地方还望大家指正 主要功能为 预约购物 组织活
  • 惊呆了!女儿拿着小天才电话手表,问我Android启动流程!

    首先 new一个女儿 var mDdaughter new 女儿 6岁 漂亮可爱 健康乖巧 最喜欢玩小天才电话手表和她的爸爸 好了 女儿有了 有一天 女儿问我 爸爸爸爸 你说我玩的这个小天才电话手表怎么这么厉害 随便点一下这个小图片 这个应
  • chromecast 协议_Chromecast和Android TV有什么区别?

    chromecast 协议 Google isn t particularly known for its clear branding This is certainly the case when it comes to Chromec
  • 电商APP开源

    电商APP开源 https github com myxh CoolShopping 效果demo CoolShopping 一个仿拉手团购的购物App 采用Bmob后台实现短信验证码注册 登录 收藏 订单管理 自动更新等功能 数据抓取自拉
  • App登录状态维持

    转载地址 http www jianshu com p 4b6b04244773 目前APP大都支持长登录 就是用户登录一次后 如果用户没有主动注销 清除APP缓存数据或卸载APP 就在一段时间内或一直保持登录状态 一般情况下 有以下三种方
  • OS X Java .app 捆绑包无法打开其他应用程序?

    我为 OS X 编写了一个 Java SWT 应用程序 将其导出为 jar 并将其捆绑到 app 中 除了我的应用程序中的关键部分之外 一切都按预期工作 它需要打开其他应用程序 我试过了Runtime exec 也ProcessBuilde
  • [2024]基于springboot的租房(房屋租赁)小程序设计

    目录 一 整体目录 示范 文档含项目技术介绍 E R图 数据字典 项目功能介绍与截图等 二 运行截图 三 代码部分 示范 四 数据库表 示范 数据库表有注释 可以导出数据字典及更新数据库时间 欢迎交流学习 五 主要技术介绍 六 项目调试学习
  • 我在哪里可以购买 .app TLD? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以购买 app 顶级域名 TLD 我去了 Network Solutions GoDaddy 等

随机推荐

  • 端口扫描:NMAP | Masscan

    NMAP nmap是港口扫描仪的合法王位 xff0c 而今天仍然是最通用的选择 xff0c 最早是Linux下的网络扫描和嗅探工具包 可以扫描主机 端口 并且识别端口所对应的协议 xff0c 以及猜测操作系统 Ping扫描 xff08 sP
  • 逆向APP - 某医药 App 样本逆向解密实战

    样本 某医药app xff0c 难度 两颗星 适合新手练习研究 版本 xff1a 202010026 登陆 随便输一个错误的账号密码 xff1a 17283828172 密码 123456789 method POST path user
  • Python开发规范及文件命名

    Python开发规范 常用目录 目录名作用log日志目录conf配置目录core核心代码libs modules第三方库docs文档库README帮助文档bin启动入口 存放可执行文件tests存放测试代码 常用的文件命名 目录名作用mai
  • python 线程的两种开启方法,及线常用方法

    线程和进程主要用法区别 线程模块 from threading import Thread 进程模块 from multiprocessing import Process 方法1 span class hljs keyword from
  • C++函数后的<>是什么?(C++Template函数模板参数列表)(函数后<>)尖括号

    在C 43 43 中 xff0c 函数名后面的 lt gt 表示函数模板的参数列表 函数模板是一种通用的函数定义 xff0c 可以接受不同类型的参数 xff0c 从而生成不同的函数实例 函数模板的参数列表由一组类型参数和非类型参数组成 xf
  • PyCharm 中数据库工具 Database 的使用方法及案例

    显示Database功能 xff08 已有自动忽略 xff09 窗口右侧打开Database 输入数据库信息登录数据库可以进行任意数据库操作 xff0c 该工具类似许多数据库管理软件
  • Django 博客文章详情页面 点赞功能案例

    使用技术 利用Ajax点赞 并 局部刷新页面绑定事件 点赞和绑定 灵活处理利用F 页面局部刷新 点赞数反序列json获取布尔值 视图 布尔值 xff0c 必须用Json反序列化才能使用F的妙用 点赞数自加1 span class hljs
  • scrapy 同时爬取多url方法实例

    案例 需求 xff1a 爬取评论页面第1页到第10页内容 一共爬10个url 思路 递归调用parse 直到每个页面爬取完 方法 span class token keyword class span span class token cl
  • Docker对接Github,docker在github中关联 并开启自动构建

    Docker对接Github 绑定github会让你的项目在每次commit后 xff0c 自动构建一个docker镜像 xff0c 无需自己操作 xff0c 神器 xff01 github创建项目项目中需要有Dockerfile文件创建d
  • 华硕主板bios通电自启设置_升级BIOS有必要吗?(续 如何安全快速的升级BIOS)

    上期内容 xff0c 我们聊了很多升级BIOS的必要性 xff0c 今天就来聊聊如何安全快速的升级BIOS 在正式内容开始之前 xff0c 我们先来说说BIOS更新的相关内容 xff0c 助于大家更理解BIOS BIOS xff0c 大家都
  • React 路由传参的三种方式

    一 params传参 1 xff0c 刷新页面后参数不消失 2 xff0c 参数会在地址栏显示 3 xff0c 需要在Route中配置参数名称 1 params传递单个参数 路由页面 span class token operator lt
  • 利用Raspberrypi系统学习Linux

    利用Raspberrypi系统学习Linux 一直想学习linux系统 xff0c 大学室友离校之前给了我一个一代的树莓派 xff0c 是他大学参加机器人基地时自己玩的 xff0c 只记得他当时很神奇的用命令行来进行操作电脑 xff0c 我
  • 利用树莓派(Raspberrypi)搭建一个服务器

    名词解释 SSH SSH 为 Secure Shell 的缩写 SSH 为建立在应用层基础上的安全协议 SSH 是目前较可靠 xff0c 专为远程登录会话和其他网络服务提供安全性的协议 利用 SSH 协议可以有效防止远程管理过程中的信息泄露
  • Px4添加一个新的机型

    添加一个新的机型 所有定义的机型文件保存在ROMFS px4fmu common init d 建立一个混控器 1 简单学习混控器定义 xff1a 舵机 电机的接口顺序和这个文件中的混控器顺序一致 意思是按照文件从头到尾的混控器顺序就是通道
  • UORB 理解与总结

    UORB是用来在各个进程之间进行通信的 xff0c 分为如下几个步骤 xff1a 发布数据 1 首先公告主题 xff1a orb advert t orb advertise const struct orb metadata meta c
  • 分布式键值存储是什么?(分布式键值存储大值)

    文章目录 什么是分布式键值存储 xff1f 分布式键值存储 大值 指什么 xff1f 什么是分布式键值存储 xff1f 分布式键值存储是一种分布式数据存储系统 xff0c 它将数据存储为键值对的形式 xff0c 并将这些键值对分散在多个节点
  • PX4 姿态控制总结

    姿态控制流程图 姿态控制的流程图 xff0c 外环产生角速率 xff0c 内环产生期望加速度 xff08 电机推力 xff09 外环
  • hpp头文件与h头文件的区别

    hpp xff0c 其实质就是将 cpp的实现代码混入 h头文件当中 xff0c 定义与实现都包含在同一文件 xff0c 则该类的调用者只需要include该hpp文件即可 xff0c 无需再将cpp加入到project中进行编译 而实现代
  • prime95 for linux

    我这里是希望能下载一个UOS下可以使用PRIME95 系统联网 xff0c 在终端里面输入 xff1a wget https www mersenne org ftp root gimps p95v303b3 linux64 tar gz
  • 初探APP架构之后端接口设计方案

    初探APP架构之后端接口设计方案 App与服务器的接口设计需要考虑很多地方 xff0c 这里整理项目中遇到的和使用到的一些接口设计原则 xff0c 抛砖引玉 1 设计思想 APP对服务器端要求是比较严格的 xff0c 在移动端有限的带宽条件