移动App的REST API设计实践
通讯协议
一些只是对服务器数据进行CRUD操作的App,通常采用HTTP协议,为了安全也可以采用HTTPS协议。IM软件可以选择使用XMPP协议。
其他一些特有场景的App可能基于Socket自定义协议。
SOCKET是实现传输层协议的一种编程API,可以是TCP,也可以是UDP。
TCP --- 传输控制协议,提供的是面向连接、可靠的字节流服务。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
在需要保证需要传输数据到对方的时候应该选择TCP协议,比如文件传输。而像在线视频播放这些,可以不用保证数据100%被接受的,可以用UDP,因为丢失一帧画面数据没什么影响,而且用UDP速度会更快。
最近也有听说用WebSocket做通讯的,可以在Web端和App端共用一个接口。
数据格式
比较通用的数据交互格式是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
一些感想:
- API域名与网站域名分开,比如使用 https://api.example.com 这样的方式
- API请求中应该加入API版本号,比如在URL中加入版本号,如
https://api.example.com/v1/, 这样当API升级的或者改动的时候,可以保留旧的API服务器,把新的API服务器mount到https://api.example.com/v2/ 上,这样使用旧的API的App也不会出现问题 - 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平台提供的服务。这些服务很适合一些不需要在服务器端提供复杂操作,以及前期的原型开发。
移动App的REST API设计实践的更多相关文章
- 移动APP服务端API设计应该考虑到的问题
2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...
- ****RESTful API 设计最佳实践(APP后端API设计参考典范)
http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...
- RESTful API 设计最佳实践
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...
- RESTful API 设计最佳实践(转)
摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...
- RESTful API 设计最佳实践(转)
背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...
- RESTful API 设计最佳实践【转】
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,后面API和RESTful API 一个意思)如何设计的文章,然而却没有一个“万能”的设计标准:如何鉴权?API格式如何?你的API ...
- app后端api设计【转】
博客:https://blog.csdn.net/newjueqi/article/details/44037011 app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入 ...
- 【转】App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- App开放接口api安全性的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证, 那么这就需要用户提供一些信息,比如用户名密码等 ...
随机推荐
- eclipes(小白)快捷键
Ctrl+shift+l :自动列出全部快捷键 alt+/ :内容助理 Ctrl+1. :快速修复 Ctrl+shift+o ...
- 如何进行服务器的批量管理以及python 的paramiko的模块
最近对公司的通道机账号进行改造管理,全面的更加深入的理解了公司账号管理的架构.(注:基本上所有的机器上的ssh不能使用,只有部分机器能够使用.为了安全的角度考虑,安装的不是公版的ssh,而都是定制版的 ...
- TJI读书笔记07-初始化
TJI读书笔记07-初始化 成员初始化 构造方法初始化 初始化块 初始化的顺序 成员初始化 java尽量去保证每个变量在使用前都会得到初始化. 对于方法局部变量,java不会自动初始化他们,如果没有显 ...
- Framework7--Test
<!doctype html> <html> <head> <title>{{title}}</title> <meta charse ...
- DropDownList怎样动态绑定数据库中的某一条数据
用Ajax动态绑定数据库的数据:点击后台查看代码,编写代码如下 if (!IsPostBack) { using (SnailTechDataContext con = new SnailTechDa ...
- 64位Win7下运行ASP+Access网站的方法
64位Win7下运行ASP+Access网站的方法 近日系统升级为WIN7 64位之后,突然发现原本运行正常的ASP+ACCESS网站无法正常连接数据库. 网上搜索多次,终于解决了问题,总结了几条经验 ...
- NDK相关以及同步相关博客收集
http://www.cnblogs.com/heiing/archive/2013/01/20/2868268.htmlhttp://blog.sina.com.cn/s/blog_461c24d5 ...
- Spring----->projects----->Spring Web Flow
1.概述(about Spring Web Folw) Spring Web Flow是spring社区一个子project Spring Web Flow builds on Spring MVC ...
- C语言学习笔记(一)_hello world
一.建立一个文件a.c,写入: #include <stdio.h> //使用printf库函数之前,必须include <stdio.h>int main()//main函数 ...
- fzu 1402 猪的安家 (中国剩余定理)
Problem 1402 猪的安家 Accept: 897 Submit: 5642Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...