REST介绍

REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:大理石构件

1、网络上的所有事物都被抽象为资源(resource);

2、每个资源对应一个唯一的资源标识(resource identifier);

3、通过通用的连接器接口(generic connector interface)对资源进行操作;

4、对资源的各种操作不会改变资源标识;

5、所有的操作都是无状态的(stateless)。

需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。

传统的请求模式和REST模式的请求模式区别:

作用 传统模式 REST模式
列举出所有的用户 GET /users/list GET /users
列出ID为1的用户信息 GET /users/show/id/1 GET /users/1
插入一个新的用户 POST /users/add POST /users
更新ID为1的用户信息 POST /users/mdy/id/1 PUT /users/1
删除ID为1的用户 POST /users/delete/id/1 DELETE /users/1

关于更多的REST信息,可以参考:http://zh.wikipedia.org/wiki/REST

RESTFul支持

3.2的RESTFul支持更为灵活,你只需要把控制器继承Think\Controller\RestController即可。 继承RestController控制器后你的访问控制器就可以支持下面的一些功能:

  • 支持资源类型自动检测;
  • 支持请求类型自动检测;
  • RESTFul方法支持;
  • 可以设置允许的请求类型列表;
  • 可以设置允许请求和输出的资源类型;
  • 可以设置默认请求类型和默认资源类型;

例如:

  1. namespace Home\Controller;
  2. use Think\Controller\RestController;
  3. class BlogController extends RestController{
  4. }

REST参数

继承了RestController后,你可以在你的控制器里面设置rest相关的属性参数,包括:allowMethod,defaultMethod,allowType,defaultType以及allowOutputType。

属性名 说明 默认值
allowMethod REST允许的请求类型列表 array('get','post','put','delete')
defaultMethod REST默认请求类型 get
allowType REST允许请求的资源类型列表 array('html','xml','json','rss')
defaultType REST默认的资源类型 html
allowOutputType REST允许输出的资源类型列表 array( 'xml' => 'application/xml', 'json' => 'application/json','html' => 'text/html',)

REST方法

RESTFul方法的操作方法定义主要区别在于,需要对请求类型和资源类型进行判断,大多数情况下,通过路由定义可以把操作方法绑定到某个请求类型和资源类型。如果你没有定义路由的话,需要自己在操作方法里面添加判断代码,示例:

  1. namespace Home\Controller;
  2. use Think\Controller\RestController;
  3. Class InfoController extends RestController {
  4. Public function rest() {
  5. switch ($this->_method){
  6. case 'get': // get请求处理代码
  7. if ($this->_type == 'html'){
  8. }elseif($this->_type == 'xml'){
  9. }
  10. break;
  11. case 'put': // put请求处理代码
  12. break;
  13. case 'post': // post请求处理代码
  14. break;
  15. }
  16. }
  17. }

在Rest操作方法中,可以使用$this->_type获取当前访问的资源类型,用$this->_method获取当前的请求类型。

REST控制器类还提供了response方法用于REST输出: 用法如下:

  1. $this->response($data,'json');

Response方法会自动对data数据进行输出类型编码,目前支持的包括xml/json/html

除了普通方式定义Restful操作方法外,系统还支持另外一种自动调用方式,就是根据当前请求类型和资源类型自动调用相关操作方法。系统的自动调用规则是:

定义规范 说明
操作名提交类型资源后缀 标准的Restful方法定义,例如 read_get_pdf
操作名_资源后缀 当前提交类型和defaultMethod属性相同的时候,例如read_pdf
操作名_提交类型 当前资源后缀和defaultType属性相同的时候,例如read_post

要使用这种方式的前提就是不能为当前操作定义方法,这样在空操作的检查之前系统会首先按照上面的定义规范顺序检查是否存在方法定义,如果检测到相关的restful方法则不再检查后面的方法规范,例如我们定义了InfoController如下:

  1. namespace Home\Controller;
  2. use Think\Controller\RestController;
  3. Class InfoController extends RestController {
  4. protected $allowMethod = array('get','post','put'); // REST允许的请求类型列表
  5. protected $allowType = array('html','xml','json'); // REST允许请求的资源类型列表
  6. Public function read_get_html(){
  7. // 输出id为1的Info的html页面
  8. }
  9. Public function read_get_xml(){
  10. // 输出id为1的Info的XML数据
  11. }
  12. Public function read_xml(){
  13. // 输出id为1的Info的XML数据
  14. }
  15. Public function read_json(){
  16. // 输出id为1的Info的json数据
  17. }
  18. }

如果我们访问的URL是:

  1. http://www.domain.com/Info/read/id/1.xml

假设我们没有定义路由,这样访问的是Info控制器的read操作,那么上面的请求会调用InfoController类的 read_get_xml方法,而不是read_xml方法,但是如果访问的URL是:

  1. http://www.domain.com/Info/read/id/1.json

那么则会调用read_json方法。

如果我们访问的URL是

  1. http://www.domain.com/Info/read/id/1.rss

由于我们不允许rss资源类型的访问,所以,调用的方法其实是read_html方法。

REST路由

我们可以借助3.2的路由参数功能,来解决REST的路由定义问题。 例如,

  1. 'blog/:id'=>array('blog/read','status=1',array('ext'=>'xml','method'=>'get')),

上面的路由定义,把blog/5路由到了blog/read/id/5 并且,约束了后缀是xml 请求类型是get。 我们还可以定义其他的路由参数,例如:

  1. 'blog/:id'=>array('blog/update','',array('ext'=>'xml','method'=>'put')),

为了确保定义不冲突,REST路由定义我们通常改成下面的定义方式:

  1. array('blog/:id','blog/read','status=1',array('ext'=>'xml','method'=>'get')),
  2. array('blog/:id','blog/update','',array('ext'=>'xml','method'=>'put')),

这样就可以给相同的路由规则定义不同的参数支持。定义了REST路由后,你的rest方法定义就不受任何约束,当然,如果路由定义的操作方法不存在的时候,系统默认的rest方法规范仍然会有效。

 

thinkphp REST的更多相关文章

  1. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  2. 在 SAE 上部署 ThinkPHP 5.0 RC4

    缘起 SAE 和其他的平台有些不同,不能在服务器上运行 Composer 来安装各种包,必须把源码都提交上去.一般的做法,可能是直接把源码的所有文件复制到目录中,添加到版本库.不过,这样就失去了与上游 ...

  3. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  4. ThinkPHP 模板substr的截取字符串函数

    ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...

  5. thinkphp数据的查询和截取

    public function NewsList(){ $this->assign('title','news'); $p = I('page',1); $listRows = 6; $News ...

  6. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

  7. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...

  8. Kindeditor在ThinkPHP框架下的使用

    1.简单调用Kindeditor的图片上传功能: a.Html部署图片预览,记录图片上传成功之后的路径,以及上传图片点击按钮 <tr> <td>活动图片:</td> ...

  9. 在thinkphp中,写的博文标签多对多关系的标签频率统计算法

    常常看到别人的博客里面,或者网站里面有这样随机颜色,但字体大小与标签出现频率有关的标签云,于是自己就想写一个.至于颜色的随机显示,那就很简单了,这里就不列代码. 因为正在学thinkphp,所以数据查 ...

  10. thinkphp怎么修改配置进入默认首页

    thinkphp文件夹下config 里面有个convention.php文件 里面有三个配置 'DEFAULT_MODULE' => 'Home', // 默认模块 'DEFAULT_CONT ...

随机推荐

  1. openwrt 编译支持sqlite3

    编译版本加载lib库 ------------------------------Libraries----------------------------------- Filesystem  -- ...

  2. mui使用总结

    mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验:这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文:想了解mui更详细的信息,请访问mui官网 DOM结构 关于mui ...

  3. jsp标签的介绍

    cankao:http://www.cnblogs.com/xdp-gacl/p/3788369.html jsp常用的标签有以下3个 1.<jsp:include>标签 2.<js ...

  4. rabbitmq集群-2

    rabbitmq集群 原文地址:https://www.cnblogs.com/lion.net/p/5725474.html rabbitmq集群介绍 rabbitmq有3种模式,但集群模式是2种. ...

  5. ListView 分页显示(转载+修改)上

    实习工作中,分配到了一个给已经上线的android成品增加需求的任务,其中一项是给每个信息显示增加分页显示的功能(ListView的显示),于是上网查资料,看到了: 原地址:http://www.cn ...

  6. HTML5: HTML5 拖放

    ylbtech-HTML5: HTML5 拖放 1.返回顶部 1. HTML5 拖放(Drag 和 Drop) 拖放(Drag 和 drop)是 HTML5 标准的组成部分.   将 RUNOOB.C ...

  7. B2C网站的系统

    管理系统 管理系统:主要做业务上的管理和内容输出,常见的有CMS(内容管理系统).CRM.SCM等, 1 供应商作为第三方,有独立开发的系统(SRM)和IO系统对接.以确定订单的状态.当然IO系统里面 ...

  8. 对于Final关键字的总结

    1.final关键字可以用于成员变量.本地变量.方法以及类. 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. 3. 你不能够对final变量再次赋值. 4.  ...

  9. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  10. 什么是索引?Mysql目前主要的几种索引类型

    一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...