移动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的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证, 那么这就需要用户提供一些信息,比如用户名密码等 ...
随机推荐
- 远程操控软件 TeamViewer for MAC 官方中文版11.0.55321
百度云:https://pan.baidu.com/s/1o77ol2y 提取密码:3tsx windows: http://download.pchome.net/internet/server/r ...
- CentOS6开启FTP及telnet服务教程
先来开通CentOS6的FTP服务吧.telnet服务也一并学习学习吧.在安装好CentOS以后,需要设置Ftp和Telnet服务文件,才能启动Ftp和Telnet服务,可以通过远程控制进行开启. 开 ...
- TListView的一些操作
1,让滚动条滚动的API SetScrollPos int SetScrollPos( _In_ HWND hWnd, _In_ int nBar, _In_ int n ...
- Dictionary和IDictionary
Dictionary<string> s = new Dictionary<string>(); 这个是s是Dictionary类型.是个类 类型,实现了接口,提供了更多的方法 ...
- {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件
在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...
- VC++绘图时,利用双缓冲解决屏幕闪烁 转载
最近做中国象棋,绘制界面时遇到些问题,绘图过程中屏幕闪烁,估计都会想到利用双缓冲来解决问题,但查了下网上双缓冲的资料,发现基本是MFC的,转化为VC++后,大概代码如下: void DrawBmp(H ...
- Decorator(装饰)-对象结构型模式
1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...
- [原创]Matlab之GUI生成EXE文件
近期因为项目需要,简化流程,写了一些Matlab程序,并配备上了GUI界面使其简单易用.然后问题来了,可移植性.使用Matlab生成EXE文件(可以封装很多的function),然后在一台安装有Mat ...
- Selenium2+python自动化31-生成测试报告
前言 最近小伙伴们总有一些测试报告的问题,网上的一些资料生成报告的方法,我试了都不行,完全生成不了,不知道他们是怎么生成的,同样的代码,有待研究. 今天小编写一下可以生成测试报告的方法.个人觉得也是最 ...
- [转] linux虚拟带库操作笔记
原文来自:“王旺的书房” ---- http://blog.itpub.net/271063/viewspace-1059840/ 分类: Linux 查看设备[root@node1 ~]# lssc ...