引语:现在互联网那么热,你手里没几个APP都不好意思跟别人打招呼!但是,难道APP就是全能的神吗?答案是否定的,除了优雅的APP前端展示,其实核心还是服务器端。数据的保存、查询、消息的推送,无不是在服务器端完成的,默默地!那么,怎样提供一个好的服务端API接口就是一个至关重要的问题了!

  也许你会说,现在APP这么泛滥,谁还不会写个服务端API接口程序啊?是的,也许,你是对的,但是本文想说明的和要讲的故事,是一个从零到一故事,是一个思想,是一个历程,一个可以推演的过程!

  在给出答案之前,先抛几个问题,如果你自认为这些方面都做得很优秀,那么恭喜你,你已经是牛人了!请于文后留下你的箴言以供借鉴,多谢!如果你感觉还有待提高的,可以尝试在这里找找答案,不谢!(注:本人使用PHP语言进行开发,但这不重要)

  1、采用什么样的服务器进行提供服务(也许不太准确)?如:soap server ?  yar server ? restful ? 好吧,我相信你肯定是用的restful风格的,因为这个才是王道!

  2、怎样确定访问来路是正常的,或者说你怎样管理访问权限?(附:怎样获取传递过来的参数)

  3、有加密方式吗?https ? 是否有区分不同场合?

  4、怎样解决编码问题?

  5、怎样控制接口版本迭代问题?

  6、上传文件怎样处理?

  7、怎样防止注入?(如果你也没有用框架)

  8、怎样提升访问速度?怎样提高并发?

  好,看完问题,让我们继续故事!

  前编:公司是一个小公司,刚成立不久,技术人员也很少,几乎是一个人负责一个项目,如web前端,web后端,安卓端、IOS端。很明显,我的任务是,服务器端接口的提供!(那里的我,经验也是可怜的)

  问题1、提供服务方式,之所以会想到用这几个东西提供服务,是因为,我用的就是PHP开发啊。PHP里就有这些东西,所以,很自然的嘛,soap,yar这两个东西在PHP与PHP程序之间的通信的确是不错的。但是,你要移动端对接,不止安卓,不止IOS。所以,只能国际化了呗!采用restful架构,其实说白了,也就是一个地址,就可以进行操作了,放心吧,大家都是这么干的,准没错!(附:请考虑提供接口只是进行数据的操作,倒底有没有必要去使用一个完整的MVC框架)

  问题2、访问权限,为什么会有这个问题呢?如果是自己的网站,那么,你所访问的地址,就是你自己提供的,根本不需要什么访问权限控制!但是,如果对外提供服务,那就得考虑了。来访的人不是内部的怎么办?他登录了没有?现在有多少人在访问这个服务?这些东西,都应该被一目了然的呈现出来。那么,怎样控制来访人员呢?方法1、在程序里写死几个密码一类的东西,让客户端访问时,带上此变量以验证;方法2、为每个客户端(我说的是安卓或ios等一套源代码)提供一个appId,appKey,访问时携带,实际上,很多大公司都是这么干的;方法3、使用Oauth等授权方式。很明显,方法2是最好的方式,有了个这个东西,你也可以很方便的进行访问的有效记录!(实践:建立权限表,建立访问日志表,如有必要,建立模块访问权限表,错误描述表)

  问题3、加密,一般提供接口我们都可以采用json方式(方便啊),那就是说,所有的访问,几乎都是采用明码传输,那么就必须有一定的假设信息被截获的防范措施(实际上,这个假设也很容易成立)!对于一般的信息,加一个普通的普通的签名即可,如:appId+appKey+访问参数+timestamp+随机字符n个 再 md5 得到签名,服务器端首先进行该签名验证,确认后,再进行后续操作!当然,对于支付一类的操作,这样的操作还是显得不够安全的,那就需要特殊对待,借助于https的加密,就安全多了!

  问题4、编码问题,也许许多人看来,这并不是问题。但是我想说的是,PHP写代码真的很方便很随意,md5,json_encode等都语言自带的函数,但是对于java和swift可能就没那么简单了,还得自己去找别人封装的东西,有时稍有不对就可能导致签名不对,所有访问都无效!(这里主要说的是包含中文的地方);我们当时大家采用的都是UTF8的编辑器开发,所以并没有什么太大问题!

  问题5、版本迭代,这是个问题!因为,如果整个网站都是你的,你想怎么改都可以,反正别人访问也就只有你网址这一个入口。但是移动APP不一样了,每个人都是独立的,他们各自的版本都是不一样的。如果共用一套接口的话,小的改动还好,向后兼容就行了,但是对于一些大方向的改动,这将是致命的,要么强行使用户不能使用以促使其更新,要么你继续写一长篇无用的不可维护的冗余代码!所以,做好版本控制是必须的,主要实现为:传入一个version参数,从而调用不同的内部接口地址,当然,你可以直接接口地址指向另一目录!这样,就有很多个版本接口共存了!如 /pro/api/v1.0/xxx, /pro/api/v2.0/xxx

  问题6、上传文件,这也是问题,因为,其他地方都是采用的文本内容传递至服务器,可以直接进行数据库保存操作,但是,对于上传文件则不一样。如果是网站,则一般只能使用Form表单进行提交,而且必须设置属性multipart/form-data,声明为文件类型。那也就是说,不能以普通的json格式提交了!解决方法有2个,方式1、先将文件以表单形式提交至服务器,服务器返回地址,再将地址组合进其他选项中,一起以json提交!方式2、整个内容以webForm表单形式提交,此类页面单独处理权限问题,并注意是否是伪造请求,可另加页面隐藏token验证!

  问题7、防止注入,也许作为开发人员,说这个已经太low,但是我还是忍不住提了,因为,真的很重要,其实,接口要做的事情很简单,接受数据,保存数据,返回状态。所以,真心觉得,没必要去用一些很成熟的大型框架,太臃肿!那么注入问题,就只有你自己解决了。php 使用 mysql_real_escape_string 及 htmlspecialchar进行过滤,基本也就够了!

  问题8、接口的访问速度,这个是很重要的。你有没有看到哪个APP访问速度很慢,大家还愿意用他的?做到秒开才是王道,由于各种验证,各种日志记录,已经消耗了不少时间,所以更要注意效率问题。索引、缓存、负载均衡、分布式,用起来。。。  哈哈,太宽泛了

  从最初什么都没有,到最后,一整套接口的完成,大概花了一个多月时间,感觉还是有很多不OK的地方,再后来准备做消息推送,做长连接,结果由于某些原因,项目被中断,也就不了了之了。

  写一点当时的过程,就当是一点点的收获吧。还记得,当初开始做的时候,参考资料实在太少,以至于做很多东西,都没有信心,只是凭感觉!!希望这篇文章能帮到部分处于这个时期的人!

  其实不管是做什么样的开发,都应该是从核心要解决的问题出发的,当你把问题都解决了之后,也许,一个好的设计好的架构就已经悄然呈现!这也许就是解决问题之美吧!

  欢迎批评,欢迎指正,欢迎提问!

怎样提供一个好的移动API接口服务/从零到一[开发篇]的更多相关文章

  1. 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)

    https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...

  2. Swift是一个提供RESTful HTTP接口的对象存储系统,目的是为了提供一个和AWS S3竞争的服务

    Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是Ope ...

  3. ASP.NET WebAPI构建API接口服务实战演练

    一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...

  4. 手把手教你用Abp vnext构建API接口服务

    ABP是一个开源应用程序框架,该项目是ASP.NET Boilerplate Web应用程序框架的下一代,专注于基于ASP.NET Core的Web应用程序开发,也支持开发控制台应用程序. 官方网站: ...

  5. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  6. API接口服务端

    <?php /** * API接口服务端 * * */ require 'mysql_class.php'; header('Content-Type:text/html;charset=utf ...

  7. 如何设计一个牛逼的API接口

    在日常开发中,总会接触到各种接口.前后端数据传输接口,第三方业务平台接口.一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护.这篇文章重点讨论一下提 ...

  8. ApsNetCore打造一个“最安全”的api接口

    Authentication,Authorization 如果公司交给你一个任务让你写一个api接口,那么我们应该如何设计这个api接口来保证这个接口是对外看起来"高大上",&qu ...

  9. 设计一个高质量的API接口

    参考网址:http://url.cn/5UaTeyv 前言 在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则. ...

随机推荐

  1. python re模块与正则表达式

    首先要先继承re模块: import re re.findall() 方法 # 返回值为列表 \w 表示一个字符,为数字,字母,下滑线之一, \W匹配任意非数字,字母,下划线 print(re.fin ...

  2. Python设计模式 - UML - 包图(Package Diagram)

    简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...

  3. python 删除非空文件夹

    import os import shutil os.remove(path) #删除文件 os.removedirs(path) #删除空文件夹 shutil.rmtree(path) #递归删除文 ...

  4. H5滑条(input type=range)

    input[type=range] { -webkit-appearance: none; width: 230px; border-radius: 10px; /*这个属性设置使填充进度条时的图形为 ...

  5. vue 和 react 路由跳转和传参

                      react  1 .跳转方式加传参 this.props.history.push({ //地址 pathname: '/film/Details', //路由传参 ...

  6. Zabbix安装部署(CentOS系统下)

    zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统 ...

  7. node.js 调试问题

    最近打算在项目过程中使用node.js辅助解决一些问题,需要用到node.js的调试技术. 通常而言,大家都会提到debugger或者node-inspector方法. debugger方法谁用谁知道 ...

  8. 拜托!面试请不要再问我Spring Cloud底层原理[z]

    [z]https://juejin.im/post/5be13b83f265da6116393fc7 拜托!面试请不要再问我Spring Cloud底层原理 欢迎关注微信公众号:石杉的架构笔记(id: ...

  9. cmd输入appium-doctor,运行时提示'node'不是内部或外部的命令

    一.提示'node'不是内部或外部命令,先按照下面步骤操作: 1.设置APPIUM_HOME系统变量,值为当前appium安装目录,例如:D:\software_install\Appium 2.设置 ...

  10. dpkg: error: dpkg status database is locked by another process

    First run: lsof /var/lib/dpkg/lock Then make sure that process isn't running: ps cax | grep PID If i ...