php 创建简单的Restful WebAPI(二)

  先说一下这个项目的代码结构吧。

  首先是index.php,我是把它作为中央控制器,一个调度器。程序通过rewrite或其他方式,把所有url导向本文件,由index.php调度其他代码。

  然后route.php,用设置好的路由规则匹配当前的url,来选择响应的controller(下面解释)来处理request,返回response。

  request.php,本文件用来解析requset信息(头部信息:method,accept,querystring,请求body的数据(主要为json格式)等),保存到内存里等待其他程序使用。

  response.php,本文件用来生成response信息(body数据(json格式),设置状态码,content-type等),返回给客户端。

  controller文件夹内的文件,这些文件用来处理具体业务逻辑,根据request.php,操作数据库,使用response.php生成结果返回给客户端。

  db.php由名字可知,本文件为数据库操作类(mysql)。

  还有其他类如日志功能,身份验证等等以后再实现吧。

  Rewite

  应用程序首先将所有url导向到index.php。可以使用Apache服务器mod_rewrite重写转向(Rewrite)模块来实现。由于我的web服务搭建在新浪SAE,它本身的config.yaml具有url重写功能,只需要加入一句 - rewrite: if(!is_file()) goto "index.php?%{QUERY_STRING}" 就可以了(config.yaml配置可参阅SAE相关文档)。

  Route

  首先在router.php配置相关规则:

<?php
/**
 *路由配置文件编写说明:
 *  路由配置在一个array数组中,一条记录代表一个规则
 *  优先匹配索引低的规则
 *  key:   只接受2中规则 ‘/{controller}‘和‘/{controller}/{id}‘。{controller}可用字符包括:字母,数字,_
 *  value: 第一项controller类名(文件名除去扩展名必须与类名相同);
 *         第二项id只能为正整数(包含0)
 *  controller文件必须位于‘/controller‘文件夹下;类名必须与文件名相同(除去扩展名.php),区分大小写。
**/
$routes= array(
    ‘/resources‘ => array(‘resources‘,‘‘),
    ‘/resources/id‘ => array(‘resources‘,‘id‘),
);
?>

  routes数组保存应用程序的相关规则,由于时间紧迫,设置规则十分不灵活,后期需要加以修改,规则及其解析我们都可以随时进行调整。routes数组key为需要匹配的url,value为响应的controller名字。前文我们有提到,我们只需要处理2种url :‘/resources‘ => array(‘resources‘,‘‘)表示匹配到/resources时,选择controller文件下的resources.php文件内的resources类来处理。‘/resources/id‘ => array(‘resources‘,‘id‘),大同小异,只不过我们需要,匹配并保存url中第二层的id。

  然后route.php解析上面的规则:

<?php

class Route
{
    private $filepath;
    private $classname;
    private $id;
    private $routepatterns; 

    public function __construct()
    {
        $this->filepath      = ‘‘;
        $this->classname     = ‘‘;
        $this->id            = null;
        $this->routepatterns = array();
        $this->initRoutes();
    }

    private function initRoutes()
    {
        $reg_m1 = ‘#^/(\w+)$#‘;
        $reg_m2 = ‘#^/(\w+)/id$#‘;
        $matches = array();
        $routes = array();
        include ‘router.php‘;
        foreach($routes as $key=>$value){  

            if(preg_match($reg_m1,$key,$matches)){
                $this->routepatterns[] = array(‘#^/(‘.$matches[1].‘)\??$#i‘, array(‘controller/‘.$value[0].‘.php‘,$value[0]));
            }
            else if(preg_match($reg_m2,$key,$matches)){
                $this->routepatterns[] = array(‘#^/(‘.$matches[1].‘)/(\d+)\??$#i‘, array(‘controller/‘.$value[0].‘.php‘,$value[0]));
            }
        }
    }

    public function processURL($urlpath)
    {
        $matches = array();
        foreach($this->routepatterns as $router){
             if(preg_match($router[0],$urlpath,$matches)){
                 $filepath_ = ‘/‘.$router[1][0];
                 $classname_ = $router[1][1];
                 $id_ = count($matches)>2?$matches[2]:null;
                 $this->setFilePath($filepath_);
                 $this->setClassName($classname_);
                 $this->setID($id_);
                 return true;
             }
         }
         return false;
    }

    public function setFilePath($filepath)
    {
        $this->filepath = $filepath;
    }  

    public function setClassName($classname)
    {
        $this->classname = $classname;
    }  

    public function setID($id)
    {
        $this->id = $id;
    }  

    public function getFilePath()
    {
        return $this->filepath;
    }  

    public function getClassName()
    {
        return $this->classname;
    }  

    public function getID()
    {
        return $this->id;
    }  

}

?>

  方法initRoutes()解析了routes所有规则,保存routepatterns中,等待使用。processURL($urlpath)方法使用解析出的routepatterns匹配传入url,获取相应的结果,并记录下来。

时间: 2024-12-28 20:37:56

php 创建简单的Restful WebAPI(二)的相关文章

php 创建简单的Restful WebAPI(一)

Restful API现在非常的流行啊,目前工作的项目也使用了ASP.NET Web API技术.用下来的感觉是前台数据的展现层可以和后台数据的处理层解耦性很好.所以在开发阶段,前台数据展现页面布局和后台数据处理调整起来都很方便.Restful API利用了http协议,配合一些类似backbone这样的js mvc框架非常好用. 最近有一个需求是用php实现一个简单的 Restful WebAPI.因为之前用的ASP.NET Web API,所以就模拟实现一下它的结构. 由路由Router来选

php 创建简单的Restful WebAPI(三)

上篇记录了怎样实现route,本篇记录怎么实现request,response. Request 处理请求 <?php class Request { private $request_vars; private $data; private $http_accept; private $method; private $ID; public function __construct($id = null) { $this->request_vars = array(); $this->

.NET:WebApi 生成帮助文档及顺便创建简单的测试工具

==========最终的效果图========== ==========下面开始干活:生成帮助文档========== 一.创建 WebApi 项目 二.找到 HelpPageConfig.cs 并取消代码注释 1 config.SetDocumentationProvider( new XmlDocumentationProvider ( HttpContext.Current.Server.MapPath( "~/App_Data/XmlDocument.xml" ))); 三.

WebApi 生成帮助文档及顺便创建简单的测试工具

http://www.2cto.com/kf/201607/522971.html ==========最终的效果图========== ==========下面开始干活========== 一.创建 WebApi 项目 二.找到 HelpPageConfig.cs 并取消代码注释 ? 1 1 config.SetDocumentationProvider( new XmlDocumentationProvider ( HttpContext.Current.Server.MapPath( "~

【译】使用python创建一个简单的restful风格的webservice应用

这是一个如何使用python快速构建简单restful风格webservice的应用教程. 1.分析rest路由规则 rest风格的服务通常使用web.py来创建服务器端脚本,一般情况下包含两个url路径: 一个是为了查询所有用户,一个是为了查询单个用户. 例如下面的url: http://localhost:8080/users http://localhost:8080/users/{id} 2.搭建web.py环境 首先你应该安装web.py模块到你的python环境下.如果你之前没有的话

IOS 创建简单表视图

创建简单表视图 此实例主要实现UITableViewDataSource协议中必须要实现的两个方法tableView:numberOfRowsInSection: 和tableView:cellForRowAtIndexPath: 当表视图显示的时候会发出tableView:numberOfRowsInSection:消息询问当前节中的行数. 当表视图单元格显示的时候会发出tableView:cellForRowAtIndexPath:消息为单元格提供显示数据. 一.实现的时序图,如下: 二.示

[原创]linux简单之美(二)

原文链接:linux简单之美(二) 我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事: 1 section .data 2 ft db "now is %d",10 3 4 section .text 5 extern puts 6 extern exit 7 extern sleep 8 extern printf 9 global main 10 11 main: 12 mov edi,1

创建简单web项目

Intellij Idea直接安装(可根据需要选择自己设置的安装目录),jdk使用1.6/1.7/1.8都可以,主要是配置好系统环境变量,tomcat7上tomcat的官网下载压缩包解压即可. 一.创建简单web项目 1.创建一个web project File -> new Project ->选择project sdk 为1.6(如果没有sdk的同学请先配置)-> Next create project from template 页面,不勾选任何选项 -> Next 输入项目

CocoStudio 创建简单UI资源并添加到工程

打开CocoStudio UI编辑器新项目,设置画布480*320, 添加一个标签和一个按钮控件 导出项目,生成所需要的资源文件, 复制到cocos2d工程Resources目录下 加入代码: 头文件: #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; using namespace ui; 加载cocostudio资源创建控件 _touchgroup = TouchG