IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

PHP API 框架开发的学习

标点符 2011-09-15 23:33:46 累计浏览 4,808 次
本机暂存

    基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户、开发者和中小网站带来了更大的价值。

    在开发API前,你需要的是给API设定一个框架,这个框架一定是要简单的且是容易扩展的。下面就是用就来看看如何使用PHP来创建一个API。

    API框架需要的特性

  • 面向对象和结构化的代码
  • 可修改的URL结构
  • 创建多个版本
  • 使用Hook来扩展框架API功能
  • API可连接数据库表
  • 可定义多种输出格式
  • 选择方法请求类型(GET, POST, PUT, DELETE)
  •     API框架的组成部分

        API Framework主要由下面三中类型元素组成:

  • Services
  • Hooks
  • Parsers
  •     在一个运行的API中,每种类型的元素都有其自己的任务。下面就来详细说说每一种元素。

        原图已失效

        通常的API请求URL如下:

        http://www.domain.com/api/version/service/method/param_name/param_key.extension

    Service

        Service Class是API请求的控制器。这个Class包含了API可以使用的method,所以Service Class会需要计算和处理数据。

        为了使method可以被请求,你需要将method设置为公开(public),并为service method设置请求类型(GET, POST, PUT, DELETE)。

        下面是一个Service Class的类,你可以设置默认的请求方式为GET,并且version method可以接受GET和POST请求。

    addAllowedMethod("execute", Api_Request::METHOD_POST);
    $this->addAllowedMethod("version", Api_Request::METHOD_POST);
    $this->addAllowedMethod("version", Api_Request::METHOD_GET);
    
    }
    
    public function execute($params, $config){
    $this->code = 200;
    return "Hello world";
    }
    
    public function version($params, $config){
    $this->code = 200;
    return "Version 1.0";
    }
    
    }

        这里是一个可以使用的使用的API请求类型:

  • Api_Request::METHOD_GET
  • Api_Request::METHOD_POST
  • Api_Request::METHOD_PUT
  • Api_Request::METHOD_DELETE
  •     如果你希望方法( method)名以驼峰式命名的话,如:

        public myNewHelloWorld{}

        那么你就需要在你的url中使用”my-new-hello-world”来请求这个方法(/v1/helloworld/my-new-hello-world.xml)。

        Hook

        Hook是一个可以绑定特定行为的类。哪些Hooks 会在执行力中执行特定的点(如图所示)。它可以让你在服务使用前修改数据。下面是一些可能的hook示例:

  • 监测用户使用的API key是否在数据库中存在。
  • 监测特定的IP地址是否是允许使用服务或行为的。
  • 在文件或者数据库中记录用户的请求日志。
  • 禁止特定的 IP使用API。
  • 限制IP每小时对API的请求数。
  •     上面的只是一些示例,你可以发挥你的想象任意的添加Hook。下面是一个关于Hook的实例:

    class Api_Hook_BlockIp extends Api_Hook_IHook {
    
    public function execute(){
    
    // Current called service
    $service = func_get_arg(0);
    
    // Get config array
    $config = $this->api->getConfig();
    
    // Stop if blocks is not configured
    if(!isset($config[\'block\'])) return;
    
    // Convert comma separated list to array
    $blocked = explode(\',\', $config[\'block\']);
    
    // Check if the user IP is blocked
    // If blocked show him a message
    if(in_array($_SERVER[\'REMOTE_ADDR\'], $blocked)){
        throw new Api_Error(\'Spammer\', \'Your IP address is blocked.\');
    }
    }
    
    }

        为了使上面的Hook可以正常的工作,你需要在config文件中添加这样一行:

        block = ip1,ip2,ip3

        接下来就是讲解不同种类的hook了:

  • HOOK_CONFIG_LOADED: 这个hook是在加载了配置(config)请求的。他可以用来修改或添加一些配置信息
  • HOOK_BEFORE_SERVICE_EXECUTE: 这个hook是在服务执行前执行的,所以它可以用来校核用户身份,查看是否有具体的权限。
  • HOOK_MODIFY_PARSER: 使用这个Hook可以在输出数据解析前修改解析器。
  •     如果要启用钩子则需要到程序的入口(endpoint.php)进行修改。

    Parsers

        解析器用来转化数据到特定的输出格式的。例如是XML,机械器就是用定义的APi请求文件扩展名来表示。例如:

  • /v1/helloworld.xml: 则使用Xml.php作为解析器
  • /v1/helloworld.json: 则使用Json.php作为解析器
  •     你可以根据自己的需求定义标准的解析器,如:

  • XML
  • CSV
  • JSON
  • Printr
  • TXT
  •     下面是一种类似PHP中print_r的输出格式示例:

    class Api_Parser_Printr extends Api_Parser_IParser{
    
    /**
    * Content type
    * @var string
    */
    public $content_type = "text/plain";
    
    /**
    * Parse to XML
    *
    * @return string
    */
    public function parse(){
    return print_r($this->_data, true);
    }
    
    }

        框架会根据命名规则自动寻找适合的输出格式。

        要顺利的开发一个PHP API,除了以上的这些还需要做的有:

  • 创建一个基本的API配置文件,并修改好程序的入口。
  • 配置自己想要的REST URL结构。
  • 记录接口中产生的错误。~
  • 同分类推荐文章

    1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
    2. Go 实验特性详解 (2026-06-21 10:05:27)
    3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

    查看更多 后端 文章 →

    建议继续学习

    1. Git常用命令备忘 (累计阅读 54,701)
    2. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
    3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
    4. Git log diff config高级进阶 (累计阅读 24,844)
    5. Git subtree 要不要使用 –squash 参数 (累计阅读 23,398)
    6. 我的git笔记 (累计阅读 20,260)
    7. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
    8. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
    9. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)
    10. 15个最好的免费开源电子商务平台 (累计阅读 12,541)