开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

使用 Zend Framework 构建 RESTful 服务

作为我上一篇文章的后续,我现在转向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操作!

未经允许不得转载:我爱分享网 » 使用 Zend Framework 构建 RESTful 服务

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏