TP 3.2 Rest使用

jerry PHP 2015年11月18日 收藏
thinkphp 3.2 rest 的操作
本人是做终端开发的,以前没有搞过php,因为有需求看了看,thinkphp这周刚开始看,因为来的时候下载的最新版,终端开发php作为后台大多是接口,所以想学习使用下tp的rest,看了几个相关的帖子都是讲的老版本的,extent下面有这个,然后有个开关开启就行了,又发现怎么开启模式后整个程序都变成了rest模式,没有测试,反正下了新版本中开启了无效,看了下源码没有这块的逻辑。

昨天发现git提交中加上了RestController,于是自己折腾了下,貌似调通了,直接继承的,这样比较灵活,想某个模块下面那个controller实现rest模式都可以。由于还没有深入看才点皮毛,也不知道用法对不对,说的不对的地方大家多指正。

1、下载最新的框架,最好是git上面的开发版本,不要3.2那个正式版,貌似RestController还没有加进去。
.htaccess 文件随便以前的或者one think里面复制一个过来吧。这样输入网址的时候可以免掉index.php 。环境配置之类的就不说了,运行下。程序下面application就有。到application home controller目录 新建一个文件。
内容如下
//InfoController.class.php
<?php
namespace Home\Controller;
use Think\Controller\RestController;
class InfoController extends RestController {
    
    //default is json
    public function read_json(){
        echo "read_default_get_json";
    }
    
    //get
    public function read_get_json(){
        echo "read_get_json";
    }
    
    //delete
    public function read_delete_json(){
        echo "read_delete_json";
    }
    
    //put/update
    public function read_put_json(){
        echo "read_put_json";
    }
    
    //get
    public function read_post_json(){
        echo "read_post_json";
    }
    
    //custom
    public function read_custom_json(){
        echo "read_custom_json";
    }
}
这个时候用ie 等浏览器访问是不行的,会访问出现403错误的,至于为什么可以看下源码RestController中的call方法,会根据 请求端的 请求头 接受类型或者设置好的默认类型等进行一系列的拼接方法,如果拼接的方法存在就调用,不存在就(_ERROR_ACTION_)403了。

浏览器中访问的话,call方法大概会适配出来的访问action为read_get_html 因为我上面没有实现这个方法,所以访问会失败。

所以这个时候用curl去请求。windows下面curl没有的话去安装一个吧。
然后开始访问如下:



我的url是本地host中做了个映射,也可以直接127.0.0.1这个就看自己的配置了。
可见通过请求类型的不同访问到了我们的controller中不同的动作,而我们的url只有一个。

上面我的代码中有个read_json方法,这个是永远执行不到的,因为RestController defaultMethod为get,不识别的请求类型 比如我最后一个other请求会使用默认的方式,拼接出来的为 read_get_json,这个方法存在所以默认都会执行该方法了,但是如果没有这个方法方法,比如把这个方法注释掉,当识别不出来的时候请求类型的时候就会执行read_json。

另外就是测试了下CUSTOM, 我的意思是看下定制自己的请求类型。当然这样做不符合标准,有get post put delete一般需求都是相当的够用。这里只是做一个测试。

直接请求是会到默认的去的,但是我这里成功执行到了,需要在RestController中修改$allowMethod,如下
 
// REST允许的请求类型列表
protected   $allowMethod    =   array('get','post','put','delete' ,'custom'); 
当然我也不建议这样直接修改源码的,最好是遵循设计模式,面向扩展而不面向修改,有这样的需求的时候在上层利用config进行动态配置,而不要修改框架。
当然因为我没有看明白,还没有看见这个东西目前能动态配置,我想稍微修改下就可以做到了,大概扫了下3.1的代码这块貌似灵活点,可能3.2还没有加全吧。

没有搜到什么教程,主要新版本刚出来,就自己琢磨了下,大概就是这么回事了,rest就是一个建议标准,RestController 中也就是$_SERVER['HTTP_ACCEPT']拼接了下方法,如果没有这个东西自己rewrite或者就写insert get delete等方法返回json,然后通过不同的url请求数据或者说rewrite下其实都一样。只是这个潮流,看起来高端一点。 应该差不多了吧,剩下的有问题,欢迎交流指正~