作为我上一篇文章的后续,我现在转向RESTfulWeb服务。我最初是在2005年参加php|tropics时遇到这个术语的,GeorgeSchlossnaggle将它比作简单的GET和POST请求。从那时起,架构风格——以及开发人员对架构风格的理解——有了一些改进,可以做出更可靠的定义。
从本质上讲,REST只是规定给定资源具有唯一地址,并且您使用HTTP动词与该资源进行交互。使用的标准动词是:
- GET:检索资源列表,或者,如果存在标识符,则查看单个资源
- POST:创建使用POST中提供的数据的新资源
- PUT:使用PUT数据更新由标识符指定的现有资源
- DELETE:删除由标识符指定的现有资源
使用的标准URL结构如下:
/resource
-GET(列表)和POST操作/resource/{identifier}
-GET(视图)、PUT,和DELETE操作
REST范例为您提供了一种简单、标准的方式来构建您的CRUD(创建-读取-更新-删除)应用程序。由于有大量可用的REST客户端,这也意味着如果您遵守规则,您将获得与这些客户端的大量互操作性。
从ZendFramework1.9.0开始,为您的MVC应用程序创建RESTful路由以及通过动作控制器处理各种REST动作变得非常容易。
Zend_Rest_Route允许您在多个级别定义RESTful控制器:
- 您可以将其设为默认路由,这意味着除非您有额外的路由,否则所有控制器都将被视为REST控制器。
- 您可以指定包含RESTful控制器的模块。
- 您可以为每个模块指定特定的RESTful控制器
例如:
$front = Zend_Controller_Front::getInstance(); $router = $front->getRouter(); // Specifying all controllers as RESTful: $restRoute = new Zend_Rest_Route($front); $router->addRoute('default', $restRoute); // Specifying the "api" module only as RESTful: $restRoute = new Zend_Rest_Route($front, array(), array( 'api', )); $router->addRoute('rest', $restRoute); // Specifying the "api" module as RESTful, and the "task" controller of the // "backlog" module as RESTful: $restRoute = new Zend_Rest_Route($front, array(), array( 'api', 'backlog' => array('task'), )); $router->addRoute('rest', $restRoute);
要定义一个RESTful动作控制器,您可以扩展Zend_Rest_Controller
,或者简单地在扩展Zend_Controller_Action
的标准控制器中定义以下方法(无论如何您都需要定义它们):
// Or extend Zend_Rest_Controller class RestController extends Zend_Controller_Action { // Handle GET and return a list of resources public function indexAction() {} // Handle GET and return a specific resource item public function getAction() {} // Handle POST requests to create a new resource item public function postAction() {} // Handle PUT requests to update a specific resource item public function putAction() {} // Handle DELETE requests to delete a specific item public function deleteAction() {} }
对于那些对单个资源进行操作的方法(getAction()
、putAction()
和deleteAction()
),您可以测试对于使用以下内容的标识符:
if (!$id = $this->_getParam('id', false)) { // report error, redirect, etc. }
回复是一门艺术
许多开发人员要么没有意识到,要么忽略了规范中规定响应应该是什么样子的部分。
例如,在经典REST中,执行POST以创建新项目后,您应该执行以下操作:
- 将HTTP响应代码设置为201,表示“已创建”
- 将Location标头设置为指向新创建项目的规范URI:
/team/31
- 提供新创建项目的表示
请注意,这里没有重定向,这与标准网络开发背道而驰(其中GET-POST-Redirect是典型格式)。这是一个常见的“陷阱”时刻。
类似地,对于PUT请求,您只需在成功时指示HTTP200状态,并显示更新项目的表示。DELETE请求应返回HTTP204状态(表示成功-无内容),没有正文内容。
注意:在构建RESTfulHTML应用程序时,您可能仍希望执行GET-POST-Redirect以防止缓存问题。以上适用于RESTfulWeb服务,这些服务通常使用XML或JSON进行交易,并具有与服务交互的智能客户端。
我将很快写另一篇文章,展示一些与HTTP标头交互的提示和技巧,包括请求和响应,因为这个主题足够长,可以单独写一篇文章。与此同时,开始使用Zend_Rest_Route
并在其上标准化您的CRUD操作!