通过上一讲,我们明白了为什么Web需要按照REST的方式来设计,而不是传统的面向对象编程的RPC方式,这一讲我们将通过一个实例来演示如何进行REST方式的Web设计,也就是让我们的设计变的RESTful。
航空公司的需求
我们假设你为一家航空公司工作,你的任务是为他们设计一个航班管理系统,它的功能包括:
- 允许公司员工通过Web前端来输入航班信息。航班信息包括航班的起飞和降落城市,以及起飞时间等。
- 允许客户通过手机查询他的航班信息。
- 允许第三方通过我们提供的API来获取我们的航班信息。
很没有难度,不是吗?如果你是个急性子,你甚至可能都顾不上将你无懈可击的设计转换成UML,就已经在你IDE的编辑框里输入了如下字符:
class FlightSchedule
def CancelFlight
......
但是慢着,在REST的世界里,我们不再需要操心这些,我们需要做的只有一件事情:
定义你的资源!
是的,就这一件,因为REST已经为我们定义好了用于操作这些资源的方法。
在这个例子里,我们首先会想到这几个资源:airports,airplanes,flights。当然可能还会有其它,但就让我们先从这几个开始吧!
我们首先要做的就是为这些资源分配URL,原则只有一个:尽可能的简单明了。
- /airports,通过这个URL可以访问所有的机场资源
- /airplanes,通过这个URL可以访问所有的飞机资源
- /flights,通过这个URL可以访问所有航班资源
还有:
- /airports/pudong,通过这个URL可以获取浦东机场的相关信息
- /airplanes/ZJ3543,通过这个URL可以获取编号为ZJ3543的飞机信息
- /flights/451,通过这个URL咋可以了解到航班451的起飞,降落城市已经起飞时间等信息。
方法已经准备好了
一旦你定义好了你的资源,整个设计也就完成了,因为,REST已经为你准备好了以下四个方法(并且不再需要其它的了):
- GET,获取资源
- POST,创建一个新资源
- PUT,更新已存在的资源
- DELETE,删除资源
通过HTTP调用这些方法
同样的,我们也不需要关心客户端如何来调用我们的方法,浏览器会帮我们搞定一切。
如果你仅仅只是在地址栏敲了个地址,然后按了下回车,浏览器会生成一条HTTP消息,并通过它来调用你输入的URL所代表的资源的GET方法。
如果你填写了一个表单,并点击了提交按钮,那么浏览器会将你填在表单中的信息组装成一条HTTP POST消息,并通过它来调用你想访问资源的POST方法。
但不幸的是,由于HTML的限制,目前你无法通过浏览器来调用资源的PUT和DELETE方法,不过这不重要,GET和POST对我们已经足够了。
好了,我们的基于REST的设计就这么完成了,下一讲,我们将演示如何使用Rest on Rails来快速优美的实现我们的设计。