Restful API在Django中的实现

在WEB应用的开发过程中,为了实现前后端分离使得前后端能分别独立进行开发工作,一套好的API至关重要。而Restful API就是现在非常流行的一种API设计方法。下面谈谈Restful API的一些概念以及Restful API在Django中的实现。


浅析Rest(Representational State Transfer)

要高效正确地编写出Restful API,首先需要对Rest有一个了解。Rest是Representational State Transfer的缩写,是一组以网络为基础的应用软件的架构的原则。满足了这些原则的应用程序或者设计就是Restful的。在谈到Rest时,往往会遇到这么一些概念:资源(Resource)、表现层(Representation)、状态转移(State Transfer)。对这些概念有一个认识会使对Rest的理解变得更加容易。下面将分别简述这些概念。

1. 资源(Resource):网络上的一个可引用的对象。它可以是一个实体(一部电影、一个影院),也可以是一个抽象的概念。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

2. 表现层(Representation):资源的表现形式可称为表现层。URI只是标识了资源,但无法表达资源的表现形式。另一方面,在客户与服务器之间传递数据时必须以某种表现形式表达数据。这种表达形式可以使JSON或各种文件格式,甚至是二进制流。一般来讲,资源的表现层会在HTTP请求的头信息中用Accept和Content-Type字段指定。

3. 状态转移(State Tranfer):访问网站可视为客户和服务器的一个互动过程。在这个过程中,必然会涉及到状态的变化。因为HTTP协议是一个无状态协议所以各种状态都保存在服务器。因此,如果客户端想要服务器完成某些操作,必须让服务器端发生"状态转移"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。客户引起状态转移的方法具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

认识了这些概念之后Rest就变得易于理解了。它包含以下原则:用URI独立标识资源,在客户与服务器之间传递这种资源的某种表现层,客户通过四个HTTP动词,使服务器对资源进行操作,实现"表现层状态转化"。


Django后台对Restful API的简单实现例子

下面的代码截取自urls.py,用以获取某一电影院里的电影。

Restful API在Django中的实现

注意到URI中最好不要包含动词,以符合规范。

下面的为实现该功能的代码,截取自views.py

Restful API在Django中的实现

该段代码首先通过对请求request的行为(method)进行判断来检查是否满足状态转移的条件,然后用json类的load方法读取出请求中的数据,在对数据库进行查询操作之后通过指定HttpResponse的content_type为json把数据序列化后打包进HttpResponse返回给客户。这一API用cinema/available_movies标识电影院中的电影资源,资源的表现层为json格式,引起状态转移的行为是POST,符合Rest的原则,应该是一个合格的Restful API。


在文章的最后,必须指出的是,Django的rest framework能达到对Restful API更好的支持。但是由于在实践中并没有用过,所以就不瞎写了。