移动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的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证, 那么这就需要用户提供一些信息,比如用户名密码等 ...
随机推荐
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)
原文出处:http://www.cnblogs.com/jacklu/p/4687325.html 本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已 ...
- Substance 6 设置 watermark(水印)
http://www.qumake.com/articles/2011/04/18/1303094833690.html ——————————————————————————————————————— ...
- Java日志系统框架的设计与实现
推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...
- VC++ 浅谈VS2010中CMFCToolBar的用法
本文将给大家介绍Visual Studio 2010中CMFCToolBar的用法,CMFCToolBar可以让用户自定义工具栏图标,使用静态成员函数SetUserImages()将一个CMFCToo ...
- Servlet 添加购物车
import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.It ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- Selenium2+python自动化20-Excel数据参数化
前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...
- detection reading
1512.07729v1 G-CNN an Iterative Grid Based Object Detector,先基于空间金字塔生成很多矩形框,然后把这些矩形框作为regions,进行fast ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
- 在Mac OS X中配置Apache
启动Apache 有两种方法: 打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)” 打开“终端( ...