介绍
今天我们学习一下 TFWEB 下的API路径规范
获取 user 列表数据
GET /user
视图文件:Views.user.inc.php
视图对象:TFResource_user
获取 user 值为 3 的单行数据
GET /user/3
视图文件:Views.user.inc.php
视图对象:TFResource_user
获取 2.0 版本的 user 的列表数据
GET /v2.0/user
视图文件:Views.user.inc.php
视图对象:TFResource_user
获取 2.0 版本的 user 值为 3 的单行数据
GET /v2.0/user/3
视图文件:Views.user.inc.php
视图对象:TFResource_user
获取 team 值为 boss 的 user 的列表数据
GET /team/boss/user
视图文件:Views.team.user.inc.php
视图对象:TFResource_team_user
获取 team 值为 boss 的 user 值为 3 的单行数据
GET /team/boss/user/3
视图文件:Views.team.user.inc.php
视图对象:TFResource_team_user
获取 1.2 版本的 team 值为 boss 的 2.0 版本的 user 的列表数据
GET /v1.2/team/boss/v2.0/user
视图文件:Views.team.user.inc.php
视图对象:TFResource_team_user
获取 1.2 版本的 team 值为 boss 的 2.0 版本的 user 值为 3 的单行数据
GET /v1.2/team/boss/v2.0/user/3
视图文件:Views.team.user.inc.php
视图对象:TFResource_team_user
扩展属性已“_”开头,可以用来对获取指定资源的数据进行基本刷新(需要在Models里编写相应的处理逻辑):
获取 user 列表数据,携带扩展属性 _baseInfo
GET /user/_baseInfo
视图文件:Views.user.baseInfo.inc.php
视图对象:TFResource_user_baseInfo
获取 user 值为 3 的单行数据,携带扩展属性 _fullInfo
GET /user/3/_fullInfo
视图文件:Views.user.fullInfo.inc.php
视图对象:TFResource_user_fullInfo
资源路径解析程序通过系统对象 RouteMap 处理,需要指定 RESTFul 接口的根目录路径
$routeMapObj->addRESTRule( "api", // 虚拟路径,对外开放的相对路径 "api" // 物理路径,服务器的真实相对路径 );
接口根目录处理程序 REST.php,该程序通过 TFRESTLoader 对象实现服务器端资源调用。把这个文件放置在上述设置的接口根目录上,文件内容如下
class TFREST extends FieldSystemRest { public function __construct($opts){ parent::__construct($opts); } protected function prepareData(){ $myRESTLoaderObj = new TFRESTLoader($this->PEO); $myRESTLoaderObj->auth( // enable auth true, // rules array( // default auth method 'default'=>"default", // other auth methods 'matches'=>array( "user.table"=>"admin", ), // no auth modals 'noAuthModels'=>array( "user.loginUser"=>true, ), ) ); $myRESTLoaderObj->load($this->PEO->input->server->TFREST); return $myRESTLoaderObj->getData(); } } $pageObj = new TFREST(array( )); $pageObj->OP();
用户资源开发通过建立继承于 TFResource 的对象实现,解析程序会调用指定资源的该对象的 load 方法。
每个资源都需要实现一个用于REST的视图文件,这个文件用于响应REST方式请求资源的处理程序。
存储在 WEB-INF/Views/REST/ 目录下,以资源名称作为文件名,扩展名为 inc.php。
例如:WEB-INF/Views/REST/user.inc.php。
如果包含版本信息的话,则将版本信息放到资源名称前面以“_”分隔,同时将版本信息中的“.”替换为“_”。
例如:WEB-INF/Views/REST/v1_2_user.inc.php。
对象命名规则 TFResource_[资源名称]。
例如:TFResource_user。
class TFResource_user extends TFResource { protected function prepareTableData($opts){ $datas = $this->model->getTableBySql("select * from tfart_users#", array( 'pageSize'=>10, 'pageNumber'=>$this->PEO->input->get->pn, )); return $datas; } protected function prepareRowsData($IDs, $opts){ return $this->model->gets($IDs); } protected function prepareRowData($ID, $opts){ return $this->model->get($ID); } }
很多时候我们需要在不同情况下对同样的资源提取一部分数据。又或者是出于安全考虑在特定情况下隐藏一部分数据。
这个时候就需要对同一个资源做扩展处理,扩展资源程序要放到扩展资源文件里。
存储在 WEB-INF/Views/REST/[资源名称]/ 目录下,以资源扩展名称作为文件名,扩展名为 inc.php。
例如:WEB-INF/Views/REST/user/baseInfo.inc.php。
对象命名规则 TFResource_[资源名称]_[扩展资源名称]。
例如:TFResource_user_baseInfo。
扩展资源的格式与标准资源是一样的
资源对象 TFResource 会根据输入参数自动选择调用内建方法 loadTable、loadRows、loadRow 获取相应的数据。
选择内建方法的原则:
a)如果请求资源没有带参数,则请求 loadTable
b)如果请求资源参数包含“,”,则请求 loadRows
c)如果请求资源参数为普通参数,则请求 loadRow
我们可以通过重载 prepareTableData、prepareRowsData、prepareRowData 来响应相应的方法返回数据
class TFResource_user extends TFResource { protected function prepareTableData($opts){ return $datas; } protected function prepareRowsData($ID, $opts){ return $datas; } protected function prepareRowData($IDs, $opts){ return $datas; } }
从数据库中提取出来的数据一般是不能直接推到视图层的,我们需要做简单的“加工”处理。
这部分工作可以在数据过滤方法里完成。
protected function filterRowData(&$rowData){ }
如果提交方式为非GET方式,则触发处理程序函数
说明
a)当提交方式为POST,则系统调用actionAdd方法,并将用户数据以数组作为参数传入
b)当提交方式为PUT,则系统调用actionMod方法
c)当提交方式为DELETE,则系统调用actionDel方法
d)当提交方式为POST、PUT、DELETE,且包含扩展属性的时候,则系统调用名称为 action_[扩展属性] 的方法
POST http://host/api/user protected function actionAdd(){ } PUT http://host/api/user/66 protected function actionMod(){ } DELETE http://host/api/user/66 protected function actionDel(){ } POST http://host/api/user/_addVIP protected function action_addVIP(){ } PUT http://host/api/user/66/_modVIP protected function action_modVIP(){ } DELETE http://host/api/user/66/_delVIP protected function action_delVIP(){ }
如果不想将所有处理方法都放到一个对象里实现,则可以使用单独的文件保存处理程序。
存储在 WEB-INF/Views/REST/[资源名称]/ 目录下,以 action_[方法名称] 为文件名称。
例如:WEB-INF/Views/REST/user/action_photo.inc.php。
对象命名规则 TFResource_[资源名称]_[方法名称]。
例如:TFResource_user_photo。
class TFResource_user_photo extends TFResource { protected function prepareAction(){ return $this->actionResultData("SUCCESS", "ok"); } }