移动App的REST API设计实践

原文:http://www.jianshu.com/p/23cccb3a90b1html

通信协议

一些只是对服务器数据进行CRUD操做的App,一般采用HTTP协议,为了安全也能够采用HTTPS协议。IM软件能够选择使用XMPP协议。android

其余一些特有场景的App可能基于Socket自定义协议。git

SOCKET是实现传输层协议的一种编程API,能够是TCP,也能够是UDP。github

TCP --- 传输控制协议,提供的是面向链接、可靠的字节流服务。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。数据库

UDP --- 用户数据报协议,是一个无链接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。编程

在须要保证须要传输数据到对方的时候应该选择TCP协议,好比文件传输。而像在线视频播放这些,能够不用保证数据100%被接受的,能够用UDP,由于丢失一帧画面数据没什么影响,并且用UDP速度会更快。json

最近也有据说用WebSocket作通信的,能够在Web端和App端共用一个接口。api

数据格式

比较通用的数据交互格式是JSON和XML。在如今,JSON格式使用的更为普遍,由于结构简单并且解析方便。浏览器

iOS5以后的SDK提供了NSJSONSerialization类解析JSON,而Android SDK自己就自带了org.json 的相关包来提供JSON解析的功能。若是在Android里面对JSON的解析或者序列化性能有要求,能够考虑使用android.utils包里面的 JsonReader 和 JsonWriter类。它们是用流式解析的方式,不过使用更加繁琐。也能够考虑使用Google的Gson,阿里巴巴的fastjson,以及 Jackson这些开源JSON处理的库,它们提供了更多的功能,也有更好的性能。安全

XML设计目标是“Extensible Markup Language”,可扩展的标记语言,而不是JSON的只是做为一个数据序列化的语言。XML格式也有本身的优势,好比你能够用通用的XPath查询特定的数据而不用用一个个嵌套的循环或者分支语句从一个复杂的数据中拿到一个特定的值。

REST架构的API设计

能够参考阮一峰文章http://www.ruanyifeng.com/blog/2014/05/restful_api.html

本文其他内容基本都是在谈REST架构的API

一些感想:

  1. API域名与网站域名分开,好比使用 https://api.example.com 这样的方式
  2. API请求中应该加入API版本号,好比在URL中加入版本号,如
    https://api.example.com/v1/, 这样当API升级的或者改动的时候,能够保留旧的API服务器,把新的API服务器mount到https://api.example.com/v2/ 上,这样使用旧的API的App也不会出现问题
  3. API返回的数据量小的时候,没太多必要进行zip压缩。API返回数据大的时候,要考虑API设计是否适当。
    4.写API要方便使用这些API开发的人员测试,好比写好文档,使用
    https://helloreverb.com/developers/swagger 这样的工具生成调试页面。

性能

要避免写API Server的时候出现一些低级的错误,好比数据库查询用了N+1 Query。

其余性能的问题其实和Web开发大同小异,无非是横向和纵向的几种不一样方式的扩展。

安全性和用户认证

若是使用第三方的API,一般采用Oauth协议或者SSO登陆。

若是是本身开发,由于本身写HTTP请求不会和浏览器发送的时候自动维护一个Cookie,因此能够本身手动维护一个Token,代替Cookie的做用来进行用户验证。

对于Token等关键的数据,不要明文保存在设备本地,能够用iOS提供的Keychain这样的机制进行加密存储。

也有用Xauth协议的,相似Oauth的简化版。

安全方便,和Web开发同样,不要相信用户的任何数据,服务器端都应该作对应的认证。

此外,若是对一些数据有较高的安全需求,那么应该避免把秘密的数据用明文写在代码里,好比一些第三方Acess Key,能够在启动的时候动态请求,不然很容易被反编译获取。

Android必定要作好反编译工做。

学习

Github的API设计应该算得上优秀,值得参考:
https://developer.github.com/v3/

此外,能够用Charles这些抓包工具,学习和参考别人的App与服务器的数据交互内容,Charles甚至能够在你的开发的移动设备上安装自签名证书,采用相似中间人攻击的方式来获取App采用HTTPS协议交互的数据的明文。

若是你不想写API

你可使用Parse.com 或者 AVOSCloud 这些BASS平台提供的服务。这些服务很适合一些不须要在服务器端提供复杂操做,以及前期的原型开发。

相关文章
相关标签/搜索