Drupal中的restful API介绍
如果你想为了你的站点开放一些公共的API,选用restful的方式无非是现在比较通用一种的做法。 最近我研究了下Drupal中实现了restful API规范的一个模块restws,现在拿来与大家分享下。
restws这个模块的代码及相关文档大家可以去drupal.org上找到,但是对于一个初次接触restful web servicel的朋友而言它的文档写的不是太详细,尤其是对我们国内的朋友如果需要使用它,可能会有些难度或困惑,本文的目的就是列出一些关键点,以帮助在国内推广Drupal中的这个restful API 模块.
基于Entity的resource
通常情况下restws要求所开放的resource是基于Entity的。 Entity是drupal中一个对于数据对象封装的一个模块,提供了CRUD操作。 对于Entity不太清楚的朋友可以去drupal.org了解下这个模块,这里不详说。下面我们举例说明一个Order对象如何开放它的restful API. 假设我们的Order对应一张数据库表order. 那么在你的module里面要做以下几点来设置Order为Entity:
- 实现hook_entity_info定义名为Order的enity type
- 实现hook_entity_property_info为Order定义entity properties
- 为Order entity定义access callback(如果不定义access callback,访问api的时候会遇到403错误,个人认为这个可能是restws的一个bug,在未来版本应该被修复)
这样你的Order就成为一个entity,只要你enable restws模块,restws会通过entity_get_info去获得entity信息,然后自动构建menu path和一个基于Entity API的RestWSEntityResourceController类的对象来做CRUD操作,返回的representation可以支持xml/json,还可以自己去继承RestWSBaseFormat去实现其它的格式。 由restws生成的CRUD的URI规范如下:
* Create: HTTP POST /<entity type name> (requires HTTP Content-Type header
set to the MIME type of <format>)
* Read: HTTP GET /<entity type name>/<entity id>.<format>
* Update: HTTP PUT /<entity type name>/<entity id>.<format>
or HTTP PUT /<entity type name>/<entity id> (requires HTTP
Content-Type header set to the MIME type of the posted format)
* Delete: HTTP DELETE /<entity type name>/<entity id>
实现非Entity的resource
如果你想开放的resource不打算定义成Entity, 也是可以的。但必须要实现以下几点:
- 在hook_restws_resource_info定义resouce的基本信息,其中最重要的一个是class属性,restws设计了一个接口RestWSResourceControllerInterface用来控制resouce,包括属性定义,CRUD操作
- 新建一个类实现RestWSResourceControllerInterface。其中的wrapper方法具体实现仍然可以是使用entity_metadata_wrapper方法实现。 resource的数据结构类似entity的array结构。
注意如果已经是Entity的resource, 则不能为它绑定一个实现了RestWSResourceControllerInterface接口的类。 因为restws已经默认为Entity的resource绑定一个类。
API的访问授权
restws对所有的API的URI都集合了drupal的role&permission机制,你可以在Pepole的Permission页面上设置每个resouce的授权。
好了就谈这么多,可能还不太详细,对于create/update/delete的一些细节也没提到,暂且先抛砖引玉, 作为入门drupal reseful web service之谈吧。
posted on 2013-07-17 14:09 Jordan_Fei 阅读(695) 评论(0) 编辑 收藏 举报