APP数据接口开发的一些经验
刚接到这样的任务时,没有感觉到任何压力,不就是给移动端应用提供数据吗?那边发来参数,这边处理数据,返回JSON。做网站开发时经常使用ajax请求后台数据,不就是这么回事吗。于是,在确认完需求后就开始干了,很快,进入联调阶段,这个时候各种问题来了,忙得不可开交。吃一堑,长一智,项目结束后总结了下,大致分为以下几点:
一、什么时候应该增加接口。
一般一个页面不存在二次请求的需求时,使用一个接口,像一般的详情页,个人信息页等;页面单一功能又需要二次请求的,像带分页功能的列表页,使用一个接口;页面含多个功能,其中有一个需要二次请求的,则需要定义多个接口了,比如个人信息页下带一个待办事项的列表,又支持分页,那如果一个接口返回全部信息的话,以后每次翻页都要刷新个人信息内容,这样就造成了不必要的信息传递。
二、 应该努力让接口的URL看上去易懂又美观。
在创建接口时就应该考虑到接口地址,文件目录不要太深,个人觉得不应超过三层,层次最好是和APP的菜单层次保持一致,这样的好处起码在以后维护也会方便很多。接口地址不应该轻易的改动,包括增加参数,因为这会导致APP重新打包,如果是已经上线,那意味着APP需要升级。
三、参数与返回值。
先说参数,笔者目前的做法是一般查询采用URL传参,增改采用POST传递JSON字符串提交数据,删除同样使用POST方式。再说返回值,我们在项目中所有接口统一返回JOSN数据,并且约定一个格式,比如这个JSON对象含三个Key,分别是data,msg和status,分别代表了返回的数据,data可能是对象或者数组,请求反馈信息和反馈状态码,这样就不用每个接口都说明一遍了。再谈一些细节,在高级语言中,数据有多种类型,String,Int,DateTime等等。而序列化为JSON后,全部变为字符串,这个时候没有给值的字段就需要注意一下,像值类型,为可空时,序列化后值直接是null表示,没有引号;为不可空时,值为默认值,同样没有引号,而DateTime则带引号,"0001-01-01T00:00:00";而像引用类型String,无值时,序列化后也变成null,而不是空串"",要想用空串""表示,必须给一个默认值,如String.Empty,说这点是因为当时iOS告诉我说字段值返回null时,他们那边报错。还有一种情况是之前遇到过的,就是数值类型的精度问题,当时接口返回一个价格字段,服务器端当然用decimal类型,并且保留两位小数,但是iOS端接收到的值小数点后却多出很多位,而Android没有任何问题,最后只好在序列化前先转成字符串类型。其它需要包含小数位的数值类型当小数点后全是0时,序列化变为整型,这种情况同样需要先转为字符串再序列化。关于DateTime类型,在作为增改参数接收时,就是反序列化后要插入到数据库,如果你正好使用了Sql Server,又使用了DateTime类型,请注意它的范围是1753-01-01 00:00:00 到9999-12-31 23:59:59,而空串转为时间为"0001-01-01 00:00:00",会报异常。最后,笔者感觉,是不是没有特殊情况,所有字段都可以给移动端返回字符串呢,像时间类型,手机上要显示到日,我就不返回时分秒了,以字符串类型返回,这样以后产品说要显示时分秒,直接在后台处理下就OK了,是不是这样的?
四、接口如何联调。
这里的联调包含两层含义,一是VS环境下的远程调试,这个具体方法在网上有很多,在这就不多说了。另一个含义就是和移动端联合测试软件功能。这次项目并没有真正远程调试几次,因为记录了详细的调试日志,所以大部分问题都能很快的定位。调试日志一般都包含了两项内容:当前环境下的关键变量值及当前方法的信息。
五、错误处理和返回错误码。
首先,切忌把异常直接抛给调用者。因为这样不论是对体验还是定位错误都没有任何益处,而是应该在后台捕获,并记录详细的日志,然后定义一套全局的错误码,返回对应的错误码给接口调用者。关于异常的捕获应该在哪里处理,个人觉得但应该不是最佳,最外层应该用try catch包裹,并记录日志,保证异常不会抛出到调用方,其它位置如果有非托管资源的使用,应该捕获,然后记录日志,释放资源,并继续把错误向上抛。
六、接口文档。
提到写文档,程序员貌似天生反感,但是开发接口,不写文档,似乎是不可能的,并且还要写得规范,别人能看懂。接口文档写得好,真的是件一劳永逸的事,写一份好文档省出的时间要远远大于写文档的时间,当然要做到及时更新,与程序同步。一般接口文档包含了功能、请求方式(GET/POST)、 地址、参数、返回值、请求示例、返回示例以及全局的安全验证方式、错误码等。
写这篇文章的目的就是想把这几个月的接口开发工作做个总结,结果拖拖拉拉写了好几天,写完再读时发现都有点变味了。文章中可能很多地方写到的处理方法或者对知识的理解并不是很正确,希望您不吝赐教,留下宝贵建议。
APP数据接口开发的一些经验的更多相关文章
- python的flex服务端数据接口开发
python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...
- node.js简单数据接口开发
随着网络时代的快速发展,前端开发不仅仅是做出漂亮的页面就可以了,还要会一点后端语言,那么后端语言有Java,php,node.js最常见,那我们应该学哪一种呢,为了让我们自己更好的学习,我推荐选择no ...
- Json-Server模拟数据接口开发
前端开发过程中调用后台接口是常事,在前后台定义好接口规范和参数后,后台接口的进度有时会成为我们的掣肘,这里推荐使用一款简单的小工具json-server,小而轻便. 确保本地已有node环境. 一:安 ...
- 2018-12-10 发布 vue全家桶实现的商城web-app,真实数据接口开发
项目地址:https://github.com/Rosen97/web-shop.git 博客地址:https://segmentfault.com/a/1190000017323841
- 使用Asp.net WebAPI 快速构建后台数据接口
现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载
转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...
- 浅谈 PHP 与手机 APP 开发(API 接口开发)
本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...
- 浅谈PHP与手机APP开发(API接口开发)
了解PHP与API开发 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK ...
随机推荐
- Redis 系列 (一) StackExchange.Redis的使用
一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象.这个类的实 ...
- UML-用例图
用例图是指由参与者.用例以及它们之间的关系构成的用于描述系统功能的视图.用例图是被称为参与者的外部用户所能观察到的系统功能的模型图,呈现了一些参与者和一些用例,以及它们之间的关系,主要用于对系统.子系 ...
- chrome浏览器渲染白屏问题剖析
刚截图十几次,终于捕捉到了这个白屏现象,hiahia~~ 大家可以很清晰地看到下边还木有渲染完毕的透明层,这是一个十分普遍的问题,经常遇到.我的浏览器版本是 到目前为止应该是最新版(release版本 ...
- FusionCharts教程文档下载
FusionCharts是一个Flash的图表组件,它可以用来制作数据动画图表,其中动画效果用的是Adobe Flash 8 (原Macromedia Flash的)制作的flash , Fusion ...
- AWS助理架构师样题解析
AWS 认证是对其在 AWS 平台上设计.部署和管理应用程序所需的技能和技术知识的一种认可.获得证书有助于证明您使用 AWS 的丰富经验和可信度,同时还能提升您所在的组织熟练使用基于 AWS 云服务应 ...
- IOS 推送-配置与代码编写
IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...
- 爱上MVC3~布局页的继承与扩展
回到 目录 在MVC3中引入了Razor引擎,这对于代码的表现力上是个突破,同时母板页也变成了_Layout,所以,我们就习惯上称它为布局页面,在razor里,布局页面是可以继承的,即,一个上下公用的 ...
- 理解 Lua 的那些坑爹特性
按:最近看到了依云的文章,一方面,为Lua被人误解而感到十分难过,另一方面,也为我的好友, 依云没有能够体会到Lua的绝妙和优雅之处而感到很遗憾,因此我写了这篇文章,逐条款地说明了 依云理解中出现的一 ...
- Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),
Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier), UUID1 作用1 组成1 全球唯一标识符(GUID)2 UUID 编辑 UUID ...
- Linux常用命令03
上篇我们写到,如何编辑文件,我们有时候,在编辑的时候,有可能会异常的退出,这样的话, linux会针对这个文件生成一个swp文件,当你下次进入vi模式时,就会提示你一个错误 这样,即使你按enter键 ...