RESTful实现中的几点细节


无状态

RESTful是基于无状态的HTTP协议的,所以在具体实现的时候不要把传统的基于状态的模式套入进来,既然使用了RESTful那么很大的一个优点就是易于扩展,那么无状态是保证扩展的一个几乎是必须条件。

在想要对我们的资源进行保护的时候我们特别想要状态,原因很简单:假如没有状态我们怎么进来的访问是有权限的呢?其实这点也很好理解,我们平时用来表示状态而维护的Session也就是一个跟随HTTP一起发送的标示符而已,所以我们也采用类似的方式,比如基于Token的方式,我们每次请求资源的时候带上相应的Token用来做权限识别。

我以前有次将ASP.NET的应用放到Amazon的Load Balancer的后面,结果出现了错误原因就是我们在服务器上维护了一个Session的状态,但是后面有多台服务器维护着各自的Session,也就是说本来想给A服务器的Session信息在经过均衡负载的时候给了B服务器,所以出现了错误,好再Amazon得Load Balancer已经考虑到这个问题,后来我们启用的Session Sticky来解决了这个问题。

RESTful API中ST指的就是(State Transfer)我们在访问资源的时候带上这些State将State带给任意一台Server,Server都可以处理这个请求返回对应的资源,这才是RESTful方式,也是可扩展的保证。

怎么样表示时间

现在基本上通用的传输格式都是JSON,XML基本看不到了,XML中无疑义的标签太多,确实不好用,这个我很早的博客中已经说到过,我很讨厌XML。JSON可以表示的数据结构有:

这基本已经覆盖了我们常用的数据结构,通过任意组合我们可以实现业务中很复杂的数据表示。但中间有个问题就是,我们怎么样表示时间?

JavaScript中又time这个对象,但是JSON中却不支持种对象表示,这也不奇怪Text-Based的东西已经在Unix的世界证明他得有点,我们也不需要多出一种数据类型,而是我们怎么样表示日期这种数据类型。通常的做法也有两种:

两种方式都可以,ISO8601的方式比较容易阅读有时区的信息,而Epoch的方式在程序间的通用性更高,在JSON中直接使用number就可以表示了。我个人倾向于选择第二种,即基于时间戳的方式。反正这些字符都不会直接就用来显示给用户,都需要处理一下,那么选择更加易于处理的Epoch的方式更加方便。

查询,排序,输出表示

我们知道HTTP的方法对应的CRUD是:

这个我们基于标准就可以了,但是对于用户的GET方法如果让用户筛选出自己想要的数据呢?HTTP的Query String就是用来干这个的,通常的做法是:

published at May 9, 2015, 8 a.m.

Comments:

Sharing your thoughts: