`
penciltim
  • 浏览: 43652 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

拙议REST及其在PHP中的现状

阅读更多

HTTP被发明出来的时候,其实REST就已经存在了。可惜这么多年来,WEB开发模式却越来越背离HTTP的本质,舍本逐末的追求起RPC之类的东西。此时REST重新回到人们的视线里,无疑让大家开始反思过去走过的弯路。
本文并不想从头介绍REST,只是想举例说明一下需要注意的问题:
先来看看人们对REST的困惑:
REST长啥样?
最一般的REST例子,类似下面的样子:


POST   /articles     创建
DELETE /articles/123 删除
PUT    /articles/123 更新或创建
GET    /articles/123 查看

 


顺便说说几个知识点:
GET操作是安全的。所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如我用GET浏览文章,不管浏览多少次,那篇文章还在那,没有变化。当 然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端 逻辑造成的。
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。
POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可 以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到 底是什么只能由服务端提供,这个时候就必须使用POST。
浏览器不支持PUT/DELETE方法怎么办?
大部分浏览器只支持GET/POST方法,这使得我们无法完美的实现REST。对于这样的情况,大致有几种解决方法,一种是在表单里加入一个 _method之类名字的隐藏字段,用于表示真正的方法,另一种是使用X-HTTP-METHOD-OVERRIDE头信息来重载POST。
HTTP方法够用么?
从上面的例子,我们可以看到,通过使用已有的HTTP方法:POST,DELETE,PUT, GET就可以完成资源的增删改查,但在实际情况中,我们需要做的操作往往并不仅仅局限在简单的增删改查操作中,比如说我们要把一篇文章“置顶”,但是 HTTP方法里没有一个和“ 置顶”操作相对应的方法,这时候该怎么办呢?REST对类似问题的解决方案是:创建一个新的资源!在上面的例子里,我们可以这样:
PUT /toparticles/123
通过创建出一个新的资源(toparticles),我们就可以使用简单的HTTP方法通吃一切操作了。

REST反对使用Session 么?
牢记一点,REST拒绝Session!这是因为REST强调无状态性。这里的状态指的的应用状态,也可以称之为会话状态。一旦在服务端保持了这样的状态,那么架构的可扩展性将大打折扣。在REST看来,任何类似的状态本身都应该是一个独立的资源。
Cookie对REST有害么?
一分为二的看,如果Cookie里保存的是应用状态的话,就没有问题。因为应用状态本来就属于客户端。但如果使用Cookie保存类似PHPSESSIONID之类的东西就不对了,因为这样的数据并不属于客户端状态,它只不过是使用Session的借口而已。
再来看看REST在PHP中的现状:
PHP里的REST实现案例不多,有点影响都就是CakePHP和Zend,下面分别看看他们的实现:
CakePHP:
设定路由:
Router::parseExtensions ('xml');
Router::mapResources('articles');
编写控制器:

class ArticlesController extends AppController {     var $components = array('RequestHandler');
    function view($id = null) {
        $article = $this->Article->findById ($id);
        $this->set(compact ('article'));
    }
    // ...
}
 

视图:

<articles>
<?php echo $xml->serialize($article); ? >
</articles>

 

差不多就这样了,相应的,还可以实现其他的功能,于是,如下REST操作便成为可能:
POST   /articles
DELETE /articles/123.xml
PUT    /articles/123.xml
GET    /articles/123.xml
总体看,CakePHP的REST实现基本上是按Rails风格来实现的,大体还过得去。
参考链接:
http://book.cakephp.org/view/476/rest
http://c7y.phparch.com/c/entry/1/art ,cakephp- rest

ZendFramework:
ZendFramework通过Zend_Rest组件来实现Rest功能:
服务端:

require_once 'Zend/Rest/Server.php'; function sayHello($who, $when)
{
    return "Hello $who, Good $when";
}
$server = new Zend_Rest_Server();
$server->addFunction('sayHello');
$server- >handle();
 

客户端:

require_once 'Zend/Rest/Client.php'; $client = new Zend_Rest_Client('http://path/to/server/script');
$client- >
sayHello('Davey', 'Day');
  |lt;br /> echo $client->get ();

 
这时候,我们看一下Web服务器的日志,会发现生成了一条如下的记录:
GET /path/to/servier/script?method=sayHello&arg0=Davey&arg1=Day&rest=1 HTTP/1.1
我们发现,实际操作方法是由URL中的method=sayHello指定的,而HTTP固有方法(GET/POST等)则成为了摆设,这是典型的RPC 风格,如果大家对比Zend_Rest和 Zend_XmlRpc文档的话,会明显发现它们根本就是一个东西,所以说,Zend_Rest是一个 REST伪实现。
参考链接:
http://framework.zend.com/manual/en/zend.rest.html
http://framework.zend.com/manual/en/zend.xmlrpc.html

分享到:
评论

相关推荐

    PHP通过VMware vCenter REST APIs 接口

    PHP通过VMware vCenter REST APIs 接口,获取所有虚机信息代码范例。 x-vmw-doc-deprecated-method: get x-vmw-doc-deprecated-path: /rest/vcenter/vm ...

    REST实战(REST in Practice)

    - **Jim Webber**、**Savas Parastatidis** 和 **Ian Robinson**:这三位专家在本书中深入浅出地讲解了REST的实际应用案例,强调了如何利用REST来构建简单而优雅的分布式超媒体系统。 - **具体实践**:作者们通过...

    REST实战.pdf 中文完整版

    在Java中实现REST服务,通常会用到JAX-RS(Java API for RESTful Web Services)规范,该规范为构建RESTful服务提供了便利的API。例如,使用`@Path`注解来定义资源路径,`@GET`、`@POST`等注解来指定HTTP方法,以及`...

    Django REST framework 中文文档.pdf

    在DRF中,这通常通过扩展REST framework的Request和Response类来实现,允许开发者对请求数据进行访问和解析,同时可以对响应数据进行格式化。 基于类的视图(Class-Based Views)是DRF中一种处理请求的高级方式,它...

    REST地图与天地图叠加

    我们将详细解释这两种技术及其在Flex客户端下的叠加应用。 首先,REST(Representational State Transfer,表现层状态转移)是一种网络应用程序的设计风格和开发方式,常用于提供Web服务。在GIS领域,REST地图服务...

    最新版PHP调环信rest代码

    在PHP中调用REST API,我们需要准备以下内容: 1. **配置认证信息**:环信API通常需要API Key和API Secret进行身份验证。这些信息可以在环信开发者平台上获取。将它们安全地存储,并在发送请求时附带在请求头中。 ...

    kettle rest 接口 请求实例

    在Kettle中,REST接口提供了一种灵活的方式与外部系统进行通信,例如,发送和接收JSON数据,执行各种操作。本教程将深入探讨如何使用Kettle与RESTful服务进行交互。 首先,我们要理解REST(Representational State ...

    Django-REST-framework教程中文版

    首先,在快速入门章节中,教程引导我们如何搭建一个项目,包括创建虚拟环境、安装Django和Django-REST-framework、创建项目以及APP,最后建立数据库迁移和超级管理员。这是进行Django REST API开发的基础准备工作。 ...

    白话REST-识别真假REST

    REST(Representational State Transfer),即“表征状态转移”,是由Roy Fielding博士在其2000年的博士论文中提出的一种软件架构风格。REST强调基于网络的分布式系统的松耦合设计,并推崇无状态通信机制。在理解...

    REST Server in Delphi XE Using DataSnap中文版

    ### REST Server 在 Delphi XE 中使用 DataSnap 的关键技术点 #### 1. REST 架构简介 - **背景**: REST(Representational State Transfer)是 Web 服务领域的一个重要概念,尤其在过去十年中,随着 Web 2.0 的...

    谷歌浏览器插件+AdvancedRestClient+Http Rest API测试调试

    1. 安装Advanced REST Client插件:首先,你需要在Chrome浏览器的Web Store中搜索“Advanced REST Client”并安装它。安装完成后,你可以在浏览器的扩展程序栏找到ARC的图标。 2. 创建新的HTTP请求:打开ARC,点击...

    Django REST framework讲义PDF全集,中文文档PDF版

    在DRF中,序列化是将Python对象转换为JSON或其他可传输格式的过程,同时也支持将这些数据反序列化回Python对象。DRF提供了ModelSerializer和Serializer两种类型,前者用于处理Django模型,后者则适用于自定义数据...

    REST in practice,英文

    通过阅读“REST in Practice”,读者可以深化对REST的理解,学习如何设计健壮、可扩展的RESTful服务,并掌握如何在实际项目中应用这些知识。这本书对于任何希望构建高性能、易于维护的Web服务的开发者来说,都是宝贵...

    Rest Severs in Delphi XE Using DataSnap

    在Delphi XE中利用DataSnap构建REST服务器是一项强大的技术,可以帮助开发者创建高效、可扩展的Web服务。本文将深入探讨这一主题,介绍REST(Representational State Transfer)架构原理,以及如何在Delphi环境中...

    Rest服务搭建范例

    描述中提到的“浏览器访问URL已标注”,这意味着在项目中可能有文档或注释,列出了可以直接在浏览器中输入的URL,以测试REST服务。例如,你可以输入`http://localhost:8080/RestDemo/hello`来调用示例中的"hello...

    cpprest实例工程

    在"cpprest实例工程"中,我们可以学习到以下关键知识点: 1. **cpprest库的安装与配置**:首先,我们需要获取cpprest库并将其正确地集成到开发环境中,这可能涉及到库文件的下载、编译以及链接设置等步骤。对于...

    Struts2 Rest方式和非Rest方式共存

    Struts2是一个非常流行的Java Web框架,用于构建可维护、可扩展且结构良好的企业级应用程序。...在开发过程中,理解并熟练掌握`RestActionMapper`的工作原理及其配置,对于构建高质量的RESTful服务至关重要。

    用WCFWebAPI在MVC3.0下实现REST

    所有的材料上来就是一大堆的名词,SOAP, WSDL,看得头都要大了,后来提出来的REST就容易理解得多,虽然目前SOAP在企业级的web service中还有一席之地,但是在公共的Internet上,不是REST的服务实在不好意思和人打招呼...

    REST实战中文版(有目录)

    在实际应用中,良好的文档和清晰的接口定义是REST API成功的关键因素。开发者往往需要根据API文档来了解如何调用各种服务接口。 由于文件中【部分内容】部分仅包含了重复的网址,并没有提供有效的知识信息,这里...

Global site tag (gtag.js) - Google Analytics