刚接到这样的任务时,没有感觉到任何压力,不就是给移动端应用提供数据吗?那边发来参数,这边处理数据,返回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数据接口开发的一些经验的更多相关文章

  1. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  2. node.js简单数据接口开发

    随着网络时代的快速发展,前端开发不仅仅是做出漂亮的页面就可以了,还要会一点后端语言,那么后端语言有Java,php,node.js最常见,那我们应该学哪一种呢,为了让我们自己更好的学习,我推荐选择no ...

  3. Json-Server模拟数据接口开发

    前端开发过程中调用后台接口是常事,在前后台定义好接口规范和参数后,后台接口的进度有时会成为我们的掣肘,这里推荐使用一款简单的小工具json-server,小而轻便. 确保本地已有node环境. 一:安 ...

  4. 2018-12-10 发布 vue全家桶实现的商城web-app,真实数据接口开发

    项目地址:https://github.com/Rosen97/web-shop.git 博客地址:https://segmentfault.com/a/1190000017323841

  5. 使用Asp.net WebAPI 快速构建后台数据接口

    现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...

  6. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  7. 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载

    转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...

  8. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...

  9. 浅谈PHP与手机APP开发(API接口开发)

    了解PHP与API开发 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK ...

随机推荐

  1. 快速学习C语言一: Hello World

    估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上. 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的. 先快速学习并练习一些基本的语言要素,基本类型,表达 ...

  2. JDBC数据类型

    JDBC数据类型 JDBC驱动程序Java数据类型转换到适当的JDBC类型然后再将它发送到数据库.它使用默认的大多数数据类型映射.例如,一个Java int转换成一个SQL INTEGER.创建默认映 ...

  3. Emberjs之Observer

    Observer Person.reopen({ fullNameChanged: Ember.observer('fullName', function() { // deal with the c ...

  4. Storm-源码分析- Storm中Zookeeper的使用

    在backtype.storm.cluster.clj中, 定义了storm对于Zookeeper的使用   ClusterState 首先定义操作Zookeeper集群的interface (def ...

  5. 人人都是 DBA(II)SQL Server 元数据

    SQL Server 中维护了一组表用于存储 SQL Server 中所有的对象.数据类型.约束条件.配置选项.可用资源等信息,这些信息称为元数据信息(Metadata),而这些表称为系统基础表(Sy ...

  6. MapReduce实例浅析

    在文章<MapReduce原理与设计思想>中,详细剖析了MapReduce的原理,这篇文章则通过实例重点剖析MapReduce 本文地址:http://www.cnblogs.com/ar ...

  7. Oracle存在修改,不存在插入记录

    接触编程以来,在数据存储方面一直用的MS SQL.Oracle这名字对我来说是如此的熟悉,但是对其内容却很陌生,最近公司的一个项目用起了Oracle,所以也开始高调的用起了Oracle.在没有接触Or ...

  8. 如何在 IIS 上搭建 mercurial server

    mercurial server 对于代码管理工具,更多的人可能更熟悉 Git 一些(Git 太火了).其实另外一款分布式代码管理工具也被广泛的使用,它就是 mercurial.多人协作时,最好能够通 ...

  9. Java-类和对象基础练习

    1.创建一个三角形类,成员变量三边,方法求周长,创建类主类A来测试它. package liu0919; public class Sanjiao { public double z(double a ...

  10. 将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)

    回到目录 对于transactionscope不了解的同学,可以看我的相关文章 第二十六回   将不确定变为确定~transactionscope何时提升为分布式事务? 第二十七回   将不确定变为确 ...