`
penciltim
  • 浏览: 42652 次
  • 性别: 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 ...

    Django REST framework 中文文档.pdf

    Django REST framework 中文文档,Django REST framework 中文翻译文档,Django REST framework 中文翻译

    REST实战(REST in Practice)

    REST实战(REST in Practice)。英文清晰PDF版。...你将会学习到很多技术,并且随着一家典型的公司从最初的小企业逐渐成长为全球化的企业,使用这些web技术和模式来解决这家公司在成长过程中产生的各种需求。

    用WCFWebAPI在MVC3.0下实现REST

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

    java rest api入门实例

    REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...

    CCP_REST_DEMO_PHP_v2.7r.zip_Ccp rest 请求_DEMO_breathl77_php短信验证码通

    1、使用Rest SDK及Demo需要先获得帐号及应用信息,并使用这些信息完成SDK初始化操作, 主帐号可以从开发者控制台获取,应用ID和子...4、本rest sdk源码在sdk目录中提供,客户对于官方未提供demo的rest可自行修改添加。

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

    Django REST framework讲义PDF全集,中文文档PDF版,非常全,章节清晰,带案例,看完即会!

    SOA与REST 用REST构建企业级SOA解决方案

    重点阐述了如何将REST作为媒介来实现SOA的战略目标,通过对REST服务的建模流程和专为REST服务定制的面向服务的分析和设计流程的详细讲解,逐步向读者展开了一幅REST与SOA在企业级解决方案中完美“联姻”的画卷。...

    elasticsearch-rest-client-6.8.3-API文档-中文版.zip

    赠送jar包:elasticsearch-rest-client-6.8.3.jar; 赠送原API文档:elasticsearch-rest-client-6.8.3-javadoc.jar; 赠送源代码:elasticsearch-rest-client-6.8.3-sources.jar; 赠送Maven依赖信息文件:elastic...

    REST实战.pdf 中文完整版

    REST模式设计的经典,不可多得的好书,我当时学习rest时就是读的这本。

    nodejs+websock+rest+rest调用

    基于nodejs的websocket平台,该平台包括异步的数据库调用,异步的rest api访问,以及能够提供rest api的服务。该平台能实现基于ws的聊天室,可以将聊天的信息调用rest api存储到数据库,可以通过网页访问该平台提供...

    rest风格webservice框架

    该项目的主要目标是:在提供同等功能的同时,尽量遵守Roy Fielding博士论文中所阐述的REST的目标。它的另一个主要目标是:提出一个既适于客户端应用又适于服务端的应用的、统一的Web视图。 Restlet的思想是:HTTP...

    最新版PHP调环信rest代码

    最新版PHP调环信rest代码

    Learning WordPress REST API

    Chapter 1, Getting Started with REST API, gives you an overview of what the REST API is, how it functions, and all that it is capable of doing. You will also find information about other platforms if ...

    elasticsearch-rest-high-level-client-6.8.3-API文档-中文版.zip

    赠送jar包:elasticsearch-rest-high-level-client-6.8.3.jar; 赠送原API文档:elasticsearch-rest-high-level-client-6.8.3-javadoc.jar; 赠送源代码:elasticsearch-rest-high-level-client-6.8.3-sources.jar;...

    REST_cn 中文版

    这篇论文定义了一个框架,致力于通过架构风格来...最后,我描述了从在超文本转移协议(HTTP)和统一资源标识符(URI)的标准中应用REST,以及从这两个标准在Web客户端和服务器软件的后续部署等过程中学到的经验教训。

    Kepware IOT gateway使用教程 - REST Sever

    Kepware中IOT gateway模块功能下REST Sever具体使用方法,过程很详细,有详细的图形指引,对研究Kepware和其他系统进行数据交互很有价值,希望对初入IOTKepware的朋友有很好的帮助

    Atlas-rest-Api接口文档(中文翻译.doc)

    Atlas-rest-Api接口文档 官网地址http://atlas.apache.org/api/v2/index.html

    Advanced REST client

    Advanced REST client,Advanced REST client 依赖的json文件在其他的资源中。

    kettle rest 接口 请求实例

    kettle rest 接口 请求实例,rest client 登陆,获取解释token,保存token,批量、单个请求接口,json交互

Global site tag (gtag.js) - Google Analytics