新的RESTful API服务解决方案:RESTful模块

RESTful模块是一个新的在Drupal系统中提供REST服务器的方法。它的概念和思想写在了模块的README文件里,因此这里就不再重复了,但这里我想分享一些这个模块的关键点。

<?php
// Handler v1.0
$handler = restful_get_restful_handler('articles');
// GET method.
$result = $handler->get(1);

// Output:
array(
 
'id' => 1,
 
'label' => 'example title',
 
'self' => 'https://example.com/node/1',
);

// Handler v1.1 extends v1.0, and removes the "self" property from the
// exposed properties.
$handler = restful_get_restful_handler('articles', 1, 1);
$result = $handler->get(1);

// Output:
array(
 
'id' => 1,
 
'label' => 'example title',
);
?>

在过去的一年,几乎我们做的每一个项目都与服务器端解耦了,而是由AngularJS来实现前端Webapp,或者AngularJS作为项目的一部分,我们仅仅是在一个Drupal页面嵌入一个这样的Web组件来提供一个有效的UI界面

在之前,我们一直使用Klausi开发的Restws模块,其封装了Entity API模块的metadata wrapper。基本上其提供的就是metadata wrapper返回的所有真实值。其工作的很好,但是暴露出来的信息有点太多了。

显然,RestWs让我们可以修改JSON响应的内容,但是我们还会遇到其他问题。作为JSON内容的消费者,客户端,你必须知道文章是一个node entity,以及tags是taxonomy terms,以及所有的字段必须以field_作为前缀,并且在此之上,一旦我们暴露一个entity,例如node,所有的bundles默认也被暴露出来。

在尝试用RestWs和Services Entity模块解决Gizra的需求之后,我们意识到概念是完全不同的,以至于我们开始开发一个新的模块,当然我们从其他模块中学到了很多。Restful模块的目标是让我们可以暴露出一个版本化的API,就像Github API,Flickr或者其他一些REST服务的API一样好。(想象一下如果Github强制你必须输入一个node的bundle,或者以field_repository的方式暴露给你版本库名该有多糟糕)

RESTful模块另一个重要的方面是,它没有尝试去做一个纯的REST服务器,是的,我们的目的不是写一篇论文,我们是要写一个Web应用,因此我们更希望遵循一些最佳实践而不是获得支持了REST的荣誉感

可以尝试一下遵循Restful模块标准实现的一个示例模块,你可以开启它并且创建几个article节点,访问/api/v1/articles可以看到一个articles列表,或者/api/v1/articles/1可以看到ID为1的article的内容。实现这个机制的代码是一个CTools的插件,因此对开发者来说应该是很容易的。到目前为止可以看到这个模块能力的其他开发资源可以参考这些测试用例

作者:Amitai Burstein
译者:理查