2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代,
不但如此,越来越多的传统应用、网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端、android客户端。
这仿佛又回到了多年前的CS架构,那时候我们用VB、VC、Delphi在Windows平台上快速开发各种应用程序。
不同的是,如今的移动端APP基本上都是联网从服务器端获取各种数据,客户端只是一个简单的表现层的工具。

不仅仅是移动APP,包括面向服务的SOA架构,都需要制定一套统一、规范的接口,
那么,做这样的后端接口需要注意哪些问题呢?

1、跨平台性

所谓跨平台是指我们的接口要能够支持不同的终端,比如android、ios、windowsphone以及桌面软件、网站等,
一套接口,支持多端,就像当年Java的口号一样“Write Once,Run Anywhere”。
当然从本质上讲,服务器端的接口跟终端是没有太大关系的,只是接口应该考虑到不同端的接入成本,
采用通用的解决方案,比如通信协议就采用最常用的HTTP协议,如果是即时通信,可以采用开放的XMPP协议,
做游戏的可以采用可靠的TCP协议,除非TCP不够用了,再采用定制的UDP协议。
数据交换采用xml或者json格式等等。
总之,要达到的目标就是让不同的端能够很方便的使用你的接口。

2、良好的响应速度

如果要用一个指标来衡量接口的性能的话,那么我想最重要的就是响应速度了。
接口应该以最快的速度将数据返回给请求者。
试想,当我们打开一个页面,如果“努力加载中”之类的提示超过三五秒钟的话,
我们肯定会变得不耐烦,移动app本来大部分就是用户在碎片化时间来使用的,
在有限的时间内,用户恨不得获得的信息越多越好,即使你的app界面设计的再好,用户也不会买账。

提高响应速度又是个老生常谈的问题,大体上应该按照以下步骤来做:
初期,以功能为主,要保证功能完整,满足业务需求,这阶段可以使用动态的语言,比如java、php、asp.net等,
配合设计良好的数据库结构和索引,能满足一定的需求;
其次,随着用户的增多,可以考虑一些缓存方案,缓存是解决性能问题的万金油,通常能起到立竿见影的效果。 
最常用的静态文件缓存,memcached内存缓存等。
然后,单台机器的吞吐率不行了,通过负载均衡多加几台机器就行了。七八台机器,支持每天千万级的接口调用是可行的。
或者,直接采用CDN的解决方案,将绝大多数的静态资源交给CDN去处理。

总之,要达到的目标就是快,一个页面,秒开最好,超过三秒就需要找找原因了。

3、接口要为移动客户端考虑

接口不仅仅是提供数据和功能就完事了,更应该充分考虑移动端的特性,为移动端提供更加方便、快捷的接口。
比如,在移动端里,下拉刷新和上拉加载更多是很常见的功能,如果接口仍然按照传统的web思路,
只提供按页读取的话,就会造成移动端的额外的数据请求和计算。 这时,接口就应该针对这两种类型的操作提供额外的支持。

再比如,对于一个新闻阅读类的app来说,最新的新闻列表里的文章,特别是前几条,用户很容易点击进去看,
而后面的老的文章列表,一来用户下滑加载好几页的情况较少,二来过时的新闻用户也很少点。
如果,接口在返回新闻列表时,对于最新的列表,可以直接把文章的正文(或者部分正文,比如一屏的内容)信息一起传给客户端,
这样,用户在打开新闻详情页的时候,就不用再从服务器端获取了,自然可以做到秒开。

比如访问第一页时,接口可以返回文章内容,如下所示 ,content=1表示加载文章内容
newslist?page=1&pagesize=20&content=1
其他页时,newslist?page=5&pagesize=20&content=0 ,不用加载文章内容。

当然,客户端要跟接口做好配合,搭配好,才能最大化的提高性能。
比如,移动端都有左右滑动来看上一篇、下一篇文章或者图片的功能,
如果,当用户请求某篇文章的时候,服务器端顺便也把下一篇文章的内容返回回来了,

那么当用户看下一篇的时候,是不是就很快了呢。

当然这种preload的方案也不能滥用,如果预加载数据的命中率较低的话,也不行,白白浪费了很多的流量。

4、考虑移动端的网络情况和耗电量

如果让我们说出哪类app比较好,可能还不大好说,但是如果让我们说出哪些app很差,
我们肯定会说出那些 体积很大、占用内存多、界面很卡、费电的app不好。

对于移动APP开发者来说, 网络流量和电池电量是不得不考虑的问题。
不过,您也许会说,这些跟接口没啥关系吧,服务器端的接口还能管得了客户端的网络流量和电量?

对于网络情况,接口应该具备为不同的网络提供不同的内容的能力,
通常,移动端的上网方式无非是2G(GSM、GPRS、EDGE)、3G(CDMA、TDSCDMA、WCDMA)、WIFI,
设想一下,如果用户在流量需要花钱的情况下,你的app给用户展示了视频、音频、大量的图片而没有通知用户的情况下,
用户会怎么想,毕竟国内的流量费用还是很贵的。
还以上面的新闻列表接口为例,如果我们能够知道用户的网络情况,只有在wifi的情况下才给用户传输封面图、缩略图之类的,
是不是可以帮用户节省很多流量呢。
newslist?page=1&pagesize=20&content=1&network=wifi

对于电量,首先我们要弄清楚,app的哪些方面会消耗电量?
比如app有大量的计算、有很炫的视觉画面都会消耗电量, 另外,不断的移动网络链接也会消耗大量的电量,
我们都知道移动网络是通过无线电波来通讯的,那么发射装置就需要消耗一定的电量来发射和接收无线信号。
特别的是,频繁的链接会不断的切换网络设备与移动基站之间连接状态,这都会消耗一部分电量。

所以,对于接口而言,尽量用少的链接传输多的数据,
比如,对于关于我们、版本更新以及一些系统配置信息,完全可以通过一次链接全部返回给客户端。

5、通用的数据交换格式

目前,对于接口和客户端的数据交换格式,基本上就是两种,xml和json,而现在使用json的应该占大多数。
交换的数据包括两种,一种是客户端请求服务器端接口时传递的一些参数,一种是服务器端返回给客户端的数据。

对于客户端的请求参数,现在也越来越多的接口要求采用json的格式,而不是以往最常见的key_value对了。
比如,接口需要username和password两个参数
key_value pair的方式是:
username=hutuseng&password=hutusengpwd
然后通过GET或者POST方式传送。
而通过json方式交换数据的话,格式如下,直接POST到服务器端。
{
'username':'hutuseng',
'password':'hutusengpwd'
}

对于服务器端返回的json数据格式,需要注意两个问题:
一是汉字编码问题,因为json(javascript)内部支持Unicode编码,会将汉字等转换成unicode编码保存, 
所以在返回结果中,对于中文,可以直接输出中文,也可以输出中文的unicode编码,
json解析器都会很好的解析。 
比如下面两种方式都是可以的。
{"code":"208","data":"\u53c2\u6570\u4e0d\u5b8c\u6574"} 
{
"code": "208",
"data": "参数不完整"
}
二是字段的数据类型,特别是数字类型的,json中尽量转成数字格式,
比如
{
'userid':128
}
不要写成
{
'userid':'128'
}

6、接口统计功能

在做PC端网站的时候,我们都会给我们的网站加上个统计功能,要么自己写统计系统,要么使用第三方的比如GA、百度等。
移动端接口API则需要我们自己实现统计功能,
这时就需要我们尽可能多的收集客户端的信息,除了传统的IP、User-Agent之外,还应该收集一些移动相关的信息,
比如
手机操作系统,是android还是ios,都是什么版本,
用户使用的网络状况,是2G、3G、4G还是WIFI
客户端APP是什么版本信息。

这样,有助于我们更好的了解我们用户的使用情况。

7、客户端与服务端的肥瘦平衡

在以前C/S、B/S架构时,我们就已多次讨论过这个问题,客户端是瘦点好还是肥点好,当然也没有固定答案,需要自己根据实际情况去做权衡。
但是,在移动开发中,由于客户端的修改会很费时费力,特别是IOS应用还要经过Apple审核,
另外,当前IOS开发人员、Android开发人员的人工成本普遍较高,人才紧缺,
基于这两点,能在服务器端实现的功能就不要放在客户端,毕竟服务器端程序的修改要比客户端方便、灵活、快捷的多。

8、隐式用户与显式用户

显式用户和隐式用户,我不知道这两个词用的是否确切。 
显式用户指的是,APP程序中有用户系统,一个username、password正确的合法用户,称之为显式的用户,
通常显式用户都需要注册,登录以后能完成一些个人相关的操作。

隐式用户指的是,APP程序本身就没有用户系统,或者一个在没有登录的情况下,使用我们APP的用户。
在这种情况下,可以通过客户端生成的UDID来标识一个用户。

有了用户信息,我们就能够了解不同用户的使用习惯,而不仅仅是全体用户的一个整体的统计信息,
有了这些个体的信息之后,就可以做一些用户分群、个性化推荐之类的事情。

9、安全问题 

网络安全已经从桌面互联网转到了移动互联网,从客户端蔓延到了接口API中。

传统固若金汤的网站,很可能因为接口的一点疏忽而遭受入侵。现在,在很多白帽子或者黑客的入侵思路中,

先看看移动端接口是否存在漏洞,再看网站是否有漏洞。

客户端APP与接口的通信很容易被得到,只要在中间路由上嗅探一下就行,
whireshark、tcpdump这类工具使得这项工作变得简单无比。

所以,接口的安全工作不能马虎,暴力破解啊、SQL Injection啊、伪造请求和数据啊、重复提交啊也要考虑到,
如果数据特别敏感,可以考虑采用SSL/TLS等加密传输,或者客户端、服务器端约定一个加密算法和密钥,对来往传输的数据进行加密、解密
如果不采用RESTful API,可以采用基于WSDL和SOAP的Web Service的安全措施。

10、良好的接口说明文档和测试程序

接口文档有时候是项目初期就定下来的,前后端开发人员按照接口规范开发,
有的是接口开发完成后写的。
接口文档要清晰、明了,包含多少个接口,每个接口的地址、参数、请求方式、数据交换格式、返回值等都要写清楚。

接口测试程序,有条件的话,也可以提供,方便前后端的调试。

11、版本的维护

随着业务的变化,客户端APP和服务器端API都会发生变化,增加新的功能,修改已有的功能,
增加功能还好说, 如果是接口需要修改,那么就面临着同一个接口要同时为不同版本的客户端服务的问题。
因此,服务器端接口也要做好相应的版本维护。

移动APP服务端API设计应该考虑到的问题的更多相关文章

  1. 移动App服务端架构设计

      我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...

  2. 从服务端架构设计角度,深入理解大型APP架构升级

    随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...

  3. 安卓推送——个推服务端api使用误区

    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成. 原理 个推服务端ap ...

  4. C#开发BIMFACE系列30 服务端API之模型对比1:发起模型对比

    系列目录     [已更新最新开发文章,点击查看详细] 在实际项目中,由于需求变更经常需要对模型文件进行修改.为了便于用户了解模型在修改前后发生的变化,BIMFACE提供了模型在线对比功能,可以利用在 ...

  5. C#开发BIMFACE系列40 服务端API之模型集成

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 随着建筑信息化模型技术的发展,越来越多的人选择在云端浏览建筑模型.现阶段的云端模型浏览大多是基于文件级别,一次只可以浏览一 ...

  6. C#开发BIMFACE系列41 服务端API之模型对比

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸.审查过程中如果发现不符合规范的地方,则流 ...

  7. C#开发BIMFACE系列43 服务端API之图纸拆分

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在上一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>的最后留了一个问题,在常规业务场景下,一 ...

  8. C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>中通过调用接口成功的创建一个离线数 ...

  9. .Net分布式异常报警系统-客户端及服务端API

    客户端 客户端的作用就是捕获未处理异常, 发送异常到服务端. 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/246 ...

随机推荐

  1. shell dev null 是什么

    1:在不想把标准输出和标准出错信息输出到控制台,也不想重定向到文件时经常使用 2:不能忽略其读入功能.从/dev/null读入时都是0 3:系统的垃圾桶,类似于Windows的回收站,不同的是这个设备 ...

  2. EXT--表单AJax提交后台,返回前端数据格式的转换

    前言: 前端发送请求至服务端(Java),得到的数据是Java语言对象所表现的形式,经常需要转换为JSON格式的字符串写出至前端:当前端获取后也往往需要将字符串转换为js的对象.本文描述了在EXT作为 ...

  3. 基于Hash算法的高维数据的最近邻检索

    一.摘要 最紧邻检索:一种树基于树结构,一种是基于hash a.随机投影算法,需要产生很多哈希表,才能提高性能. b.基于学习的哈希算法在哈希编码较短时候性能不错,但是增加编码长度并不能显著提高性能. ...

  4. oracle——外连接查询

    一.问题描述 有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询. 比如:两个表,产品表和子产品表 注:子产品的parent_product_id ...

  5. powerdesigner使用之——从“概念模型”到“物理模型”

    现实问题在计算机上的解决,需要我们从现实问题中抽象出实体模型,然后再将实体模型对应到数据库关系表中. 例如,我们在思考学生选课,这件事情上,实体模型就是“学生”和“课程”两个 此时,我们使用power ...

  6. Const和ReadOnly区别及其用途--转载

    常量的概念就是一个包含不能修改的值的变量,常量是C#与大多数编程语言共有的.但是,常量不必满足所有的要求.有时可能需要一些变量,其值不应改变,但在运行之前其值是未知的.C#为这种情形提供了另一个类型的 ...

  7. JavaScript执行上下文

    变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...

  8. iOS开发中@selector的理解

    @selector 是什么? 1一种类型 SEL2代表你要发送的消息(方法), 跟字符串有点像, 也可以互转.: NSSelectorFromString() / NSSelectorFromStri ...

  9. H5 移动Web框架集合

    http://frozenui.github.io/  一个简洁的h5前端框架 http://weui.github.io/weui/ 腾讯出的WebUI 风格是基于微信

  10. Java学习笔记之:Java StringBuffer类

    一.引言 当对字符串进行修改的时候,需要使用StringBuffer类. 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未用对象 ...