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. flume源码

    IDEA查看源码 IDEA快捷键 1 查看接口的实现类:Ctrl+Alt+B 选中按快捷键,然后跳到实现类的地方去 2 切换页面:Alt+<- 和 Alt+-> Alt+-> 3 查 ...

  2. 编译自己的jdk(使用openJDK源码编译jdk )

    找到openjdk网站(http://hg.openjdk.java.net/) 选择需要编译的版本,浏览readme文件,有获取源码及编译步骤 CentOS-7-x86_64-DVD-1804.is ...

  3. Delphi 获取系统的语言环境参数GetSystemDefaultLangID、VerLanguageName、GetLocaleInfo

    1 核心的两个API函数:GetSystemDefaultLangID 和 VerLanguageName. GetSystemDefaultLangID:获得系统默认语言的ID VerLanguag ...

  4. FTP上传脚本

    脚本名称:uploadToFtp.sh 脚本用途:上传文件到FTP服务器 脚本参数:$1:FTP服务器的路径,$2:本地文件 #!/bin/bash FTP_USER="testfile&q ...

  5. 2017 NOIp 初赛体验

    很菜...我还是太蒟蒻了. d 老师太强了... 应该能有七十几分 初赛稳了 Update: 五十几分...

  6. Python3中 if __name__=='__main__'是个什么意思

    在python前期学习中或者在学flask中,if_name_ = ="_main_"经常出现在我们的眼帘中,我们经常会问,这个是个什么玩意儿,它是干什么的? 我们知道,if 语句 ...

  7. Python3 tkinter 界面布局(转自https://blog.csdn.net/junjun5156/article/details/72510927)

    所谓布局,就是指控制窗体容器中各个控件(组件)的位置关系.tkinter 共有三种几何布局管理器,分别是:pack布局,grid布局,place布局. pack布局 使用 pack布局,将向容器中添加 ...

  8. 一.jenkins安装(windows环境)

    前提:jdk等已安装 jenkins下载地址:https://jenkins.io/download/ 以我目前的知识记录两种启动方式: 1.直接下载war包 通过   java -jar jenki ...

  9. XStream教程

    XStream是一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和xml文档相互转换). 特点 使用方便 - XStream的API提供了一个高层次外观,以 ...

  10. firefox error downloading

    转自:http://blog.csdn.net/feigeswjtu/article/details/42146285 做过互联网开发的都知道,firefox是我们互联网开发必备浏览器之一,浏览器是载 ...