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

通讯协议

一些只是对服务器数据进行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

一些感想:

  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平台提供的服务。这些服务很适合一些不需要在服务器端提供复杂操作,以及前期的原型开发。

移动App的REST API设计实践的更多相关文章

  1. 移动APP服务端API设计应该考虑到的问题

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...

  2. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  3. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  4. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  5. RESTful API 设计最佳实践(转)

    背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...

  6. RESTful API 设计最佳实践【转】

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,后面API和RESTful API 一个意思)如何设计的文章,然而却没有一个“万能”的设计标准:如何鉴权?API格式如何?你的API ...

  7. app后端api设计【转】

    博客:https://blog.csdn.net/newjueqi/article/details/44037011 app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入 ...

  8. 【转】App开放接口api安全性—Token签名sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

  9. App开放接口api安全性的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证, 那么这就需要用户提供一些信息,比如用户名密码等 ...

随机推荐

  1. Hadoop MapReduce编程 API入门系列之小文件合并(二十九)

    不多说,直接上代码. Hadoop 自身提供了几种机制来解决相关的问题,包括HAR,SequeueFile和CombineFileInputFormat. Hadoop 自身提供的几种小文件合并机制 ...

  2. 通过Percona XtraBackup添加一个slave

    假设我的master是172.16.15.8,要添加的slave是172.16.15.9 1:在主服务器执行备份操作(172.16.15.8) /usr/bin/innobackupex --comp ...

  3. mysql 不允许连接

    错误提示: ERROR 1130: Host '192.168.1.1' is not allowed to connect to this MySQL server的解决方法: 1.改表法.可能是你 ...

  4. java时间相减(转载)

    package com.jie.java.phone; import java.text.ParseException; import java.text.SimpleDateFormat; impo ...

  5. LoadRunner ---思考时间设置

    用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的.例如一次订单提交,用户需要时间核对自己填写的信息是否正确等. 也就是说用户在做某些操作时, ...

  6. php.ini 不生效问题extension

    date.timezone = PRC extension_dir = "ext"

  7. IOC和AOP使用扩展 多种方式实现依赖注入

    多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...

  8. SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  9. Centos7 php 5.6.19编译安装

    0x01  前言 在php官网下载php-5.6.19.tar.gz源代码(php7虽然说性能提升很大,但是小菜菜还是先用着这个先吧),解压后根目录有个INSTALL文件,里面有安装教程了,目录如下: ...

  10. [windows]快速从ftp下载最新软件包的批处理脚本

    背景 由于敏捷开发,快速迭代,我们项目一天会有三个版本,也就意味着我一天要去获取三次软件包.我负责服务端开发,所以我经常需要去拿最新的客户端.我们的客户端放置在一个公共的ftp上面.每天频繁登陆ftp ...