技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> PHP API 框架开发的学习

PHP API 框架开发的学习

浏览:3825次  出处信息

    基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的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. 如何寻找一个不会让你后悔的PHP开发框架    (阅读:5367)
    2. 自己写的一个轻量级javascript框架的设计模式    (阅读:4037)
    3. 对于PHP大型开发框架的看法    (阅读:4012)
    4. 异步编程与响应式框架    (阅读:3911)
    5. 服务框架演变过程    (阅读:3665)
    6. 也谈谈前端,架构,框架与库    (阅读:3586)
    7. JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述    (阅读:3066)
    8. 使用CSS框架的优点和缺点    (阅读:2635)
    9. Web开发框架安全杂谈    (阅读:2571)
    10. 关于 Jetty Continuation    (阅读:2450)
    QQ技术交流群:445447336,欢迎加入!
    扫一扫订阅我的微信号:IT技术博客大学习
    © 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

    京ICP备15002552号-1