app后端设计(1)--api(2014.01.31更新)

2023-05-16


 

 (1)Restful设计原则

 

    Restful风格:RESTfu设计原则,它被Roy Felding提出(在他的”基于网络的软件架构“论文中第五章)。而REST的核心原则是将你的API拆分为逻辑上的资源。这些资源通过http被操作(GET ,POST,PUT,DELETE)。

       但现在看,一般的操作只有两种:GET ,POST。

    这个设计原则最简单的应用就是根据object而不是页面来设计api。最开始的时候,app的一个页面需要什么数据,api就返回什么数据。结果随着app的UI不断改版,需要的数据不断变化,不停地修改api,最后当api的改动会影响以前的版本的时候,只能写一个新的api版本,最后弄得api中有很多_V2,V3这样的标志,恶梦!

    后来在网站的重构过程中,就根据object来设计api,但根据object来设计,又有一个问题,一个大object可能包含很多小object,是一个api返回全部小object,还是分为多个api返回?根据业务和技术,带宽等仔细考虑吧。

 

(2) api的命名

    其中一个原则,一看api名字就知道这个api是干啥。在创业团队中,一般就只有一两个人负责后台,当你要负责几十甚至上百个api,你就知道不能“望名知api”是个什么样的痛苦。

 

(3)    安全性,请看 http://blog.csdn.net/newjueqi/article/details/18887571 

(4) api返回数据

    app客户端的语言 java 和object-c都是强类型语言,所以怎么处理空值显得特别重要,不合理的设计很容易造成app的闪退。

    从后台的角度来说,api中返回的数据中,正确值和空值的类型必须一样,举例,用户名的字段是“realname": "xxx”,如果用户名为空,则应该返回“realname": ""。如果返回值是一个array,空数据则返回一个空array,绝对禁止null值。

    对于客户端,必须用个全局的函数来处理所有api的返回数据,需要有一个机制:对于某个客户端需要数据,如果api中缺失,客户端自动补上并给予默认值。这个机制在我们的实践中大大减少了app的闪退。

    同时,在数据库设计的时候,一个合理的设计必须是所有字段都有默认值,不应该允许null值。null在大量的语言和数据库中,会带来无穷的问题。对于这个数据库设计原则,我以前不太明白,现在经历了一年的api设计后,终于懂得。

    如果客户端是php,还有一个问题,php中数组和字典都是array,但在java 和object-c中是不一样,这个问题一定要注意。

 

(5)图片的处理

 

    在不同版本的app中,各种不同尺寸的手机中,同一张图片显示的尺寸可能是不一样,如果每次都需要用返回原图,然后在客户端处理,则极大浪费网络资源。而如果是后台处理好图片才返回,则又是一个挑战,怎么有效保存和裁剪多种图片尺寸呢

    例如,一开始头像只需要返回60*60的尺寸,后来在新的版本需要返回70*70, 又出了一个新版本,需要返回80*80, 每次增加一个新的尺寸,怎么在数据库上记录下来。这个问题在一开始做api的时候没考虑,后来不得不用了一个极端的方法,没增加新的图片尺寸,就在数据库中增加一个新的字段,保存并生成新的图片尺寸,结果最后数据库的头像字段有"avatar","avatar_60_60","avatar_70_70","avatar_80_80",这种极度恶虐的设计。

    最后,针对图片,我们才用了这样的策略:

(1)客户端本地缓存图片,只有没有合适的图片,才去服务器取。

(2)当客户端需要某种尺寸的图片,由客户端告诉服务端图片的尺寸,服务端动态生成并缓存起来。

 

     例如,客户端需要图片(http://www.baidu.com/img/bdlogo.gif)的80*80的尺寸,则在图片的路径加上宽和高的参数(类似于CDN的机制) http://www.baidu.com/img/bdlogo.gif?w=80&h=80, 则服务器就生成80*80的尺寸并返回。

 

    采用了这样的图片处理机制,数据库中只要有一个字段保存原图就行了,其它尺寸就由客户端告诉服务端动态生成。以后无论什么尺寸的图片,数据库中都不需要记录,数据库只有原图就行了。

 

(6)返回的提示信息

   最科学的情况,服务端只返回信息代码,具体的文字提示由客户端决定。

    如果文字信息是由服务端返回,则最起码要区分2种信息:提示用户的信息,提示客户端程序员的信息。这两者的区别:

1.提示用户的信息是要在让客户知道的,提示客户端程序员的信息不需要让客户知道的。

2. 提示用户的信息文字很友好,客户不需要专业基础一看就知道是什么,提示客户端程序员的信息则很专业,例如告诉客户端少传了哪个参数?哪个参数有问题等等。

 

(7)在线api文档和测试

 

    我们网站的api在线测试文档,既是一份在线api文档,也是一个在线测试工具,极大方便沟通和测试。每次客户端程序员觉得某个api有什么问题,我们就是这个在线工具上讨论沟通的。客户端程序员最喜欢这个玩意了^-^。

    上个图解一下馋(这个图是旧版的api,已经弃用了):



负责做这个功能的同事专门写了篇博客详细介绍了这个在线api测试文档,还带有demo:

 

 http://amuropikin.iteye.com/blog/1701537

 

 

app后端系列文章总目录

 

 如果您觉得这系列的文章对你有所帮助,欢迎打赏。
支付宝账号:190678908@qq.com 收款人:曾健生


///

2014.01.31: 扩展了app的通讯安全性的讨论 

 


 

[文章作者]曾健生

[作者邮箱]h6k65@126.com

[作者QQ]190678908

[新浪微博] @newjueqi

[博客] http://blog.csdn.net/newjueqi

http://blog.sina.com.cn/h6k65

 

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

app后端设计(1)--api(2014.01.31更新) 的相关文章

  • AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 跨域请求 xff0c 顾名思义 xff0c 就是一个站点中的资源去访问另外一个不同域名站点上的
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 2 xff0c 预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTION
  • 将文本文件的内容或者文字保存成图片

    调用方法 xff1a ConvertTextFileToImage Server MapPath 34 Log txt 34 Server MapPath 34 Log png 34 实现代码 xff1a void ConvertTextF
  • 2011年终总结:为了娜娜的微笑

    蒙娜丽莎为什么笑 xff1f 这个问题 xff0c 如果达 芬奇自己都没有交代过 xff0c 那么就没有人知道答案了 xff0c 后来所有的答案都是推测的 xff0c 答案众说纷纭 xff0c 这里就不做评论了 作为计算机运行的代码 xff
  • 安装windows+两个ubuntu(三系统)成功案例

    在已有的win10 43 ubuntu18 04双系统基础上 xff0c 再安装一个ubuntu20 04 原有配置 1T固态硬盘 43 2T机械硬盘 xff1b 固态硬盘上已经安装了win10 xff0c 机械硬盘上一个分区已经安装了ub
  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • ROS学习记录——Gazebo 里添加自己的物体模型

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言 一 下载3D模型 二 编辑三维模型 1 使用sketch up 2 使用blender编辑 三 将三维模型导入Gazebo 1
  • 【NEUQ RM SI战队项目开源】gazebo仿真开源

    NEUQ RM SI战队项目开源 gazebo仿真开源 写在前面演示视频第一部分 xff1a 机器人仿真环境正文 xff1a 基于gazebo的RM仿真环境贡献照片墙 写在前面 一个新冠疫情 xff0c 打乱了所有队伍的备赛计划 xff0c
  • 嵌入式软件高频面试题

    本文转载自公众号 xff1a 嵌入式Hacker 原文地址 xff1a 职场人生 嵌入式软件高频面试题 一 进程与线程 1 什么是进程 线程 xff0c 有什么区别 xff1f 进程是资源 xff08 CPU 内存等 xff09 分配的基本
  • Ubuntu下硬件信息的查看

    一 相关命令 1 查看cpu信息概要 xff1a lscpu 2 大而全的命令 xff08 查看cpu的信更加全面 xff09 xff1a cat proc cpuinfo 3 查看整个系统的硬件信息 xff1a lshw 如果觉得终端看起
  • 我的2011—前脚踏进了IT行业的一步,大一Java开发学生。

    我写这个犹豫了很久 xff0c 想想在CSDN都是在这条路上走了几年的 xff0c 十几年的 xff0c 我还只是走了半年的一个90后 但是 xff0c 在这半年里 xff0c 我的感触颇深 xff0c 所以就献丑了吧 从高考完了的那一天就
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • 集群多机ROS通信中间件:swarm_ros_bridge

    最近写了一个无线网络环境下 xff08 比如WIFI xff09 多机ROS通信的ROS包 swarm ros bridge xff1a https gitee com shu peixuan swarm ros bridge 该项目已被R
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • ClickHouse服务端配置最佳实践

    安装好ClickHouse xff0c 需要对服务和用户进行配置 本文介绍ClickHouse建议配置方式 xff0c 配置项修改后是否需要重启 xff0c 另外还提供一些实例配置加深理解 独立自定义配置 Clickhouse 服务端配置包
  • 2014年度总结——软件产品化的简要理解

    2014年度总结 软件产品化的简要理解 2014年转瞬即逝 xff0c 真是让人感慨 xff0c 岁月不是一天天在逝去 xff0c 而是一年年 xff1b 总结一年的工作非常有意义 xff0c 觉得今年最大的变化就是从定制软件到产品化的过度
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1

随机推荐