基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的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请求。

<?php
class MyApi_Service_Helloworld extends Api_Service_IService
{public function __construct($api){parent::__construct($api);// Set execute request methods$this->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 configuredif(!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 messageif(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,除了以上的这些还需要做的有:

  1. 创建一个基本的API配置文件,并修改好程序的入口。
  2. 配置自己想要的REST URL结构。
  3. 记录接口中产生的错误。~

引用地址:http://www.biaodianfu.com/php-api-framework.html

PHP API 框架开发的学习相关推荐

  1. java 微信api框架_Java架构学习(五十二)使用框架开发微信微信框架介绍整合微信开发框架WxJava使用微信返回消息模板接口使用WxJava框架发送模板消息http协议参数转义知识...

    一.微信框架介绍 1.access_token是公众号的全局唯一调用接口的凭证,它两个小时更新一次. 获取access_token方法: https请求方式: GET https://api.weix ...

  2. 尚硅谷2020最新版周阳SpringCloud(H版alibaba)框架开发教程 学习笔记

    前言:今天看到周阳老师出了新课,十分欣喜,很喜欢周阳老师的讲课风格,内容也充实,我也算是周阳老师忠实粉丝啦. 新出的springcloud第二版很符合我现阶段的学习需求.但美中不足的是,目前只有视频资 ...

  3. 使用Taro小程序框架开发一个学习、刷题、论坛、聊天交流的微信小程序

    本项目小程序端采用Taro技术框架,可将React代码编译为微信小程序.安卓APP.IOS程序.H5页面等,管理端采用React Hook + TypeScript来进行开发 项目介绍 当代大学生上课 ...

  4. PHP_MVC框架开发,nosql学习,mysql优化,以及高并发web架构处理

    文章目录 定义入口文件 完成自动加载 路由类 .htaccess explode trim array_slice 实现 控制器 加载控制器 数据库 初始化连接 数据查询函数 视图 extract 其 ...

  5. 从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年

    文 | Peter潘欣@知乎 和深度学习框架打交道已有多年时间.从Google的TensorFlow, 到百度的PaddlePaddle,再到现在腾讯的无量.很庆幸在AI技术爆发的这些年横跨中美几家公 ...

  6. python django开发api_基于Django框架开发Restful api

    在上篇文章中,我们讲解了restful api的主要概念,让大家有初步的了解.这一篇中,我们将通过python的Django框架,来学习开发restful 架构的接口. 一. 开发环境 开发语言:Py ...

  7. java若依框架开发api接口(添加新模块)

    在java的spingboot框架中比较好的开源后台那必须是若依了!为了方便管理自己开发的api接口,添加自己的模块,将api接口统一管理在该模块中! 记得三连哦~ 1.下载若依admin,链接:Ru ...

  8. react ui框架_Web开发 React 学习(二十)连载基础篇大结局

    系列文章: 测开技能--Web开发 React 学习(一) 测开技能--Web开发 React 学习(二)环境搭建 测开技能--Web开发 React 学习(三)元素的渲染 测开技能--Web开发 R ...

  9. 新课程盘古人工智能框架开发专题发布,智华欢迎读者学习!

    新课程盘古人工智能框架开发专题发布,智华欢迎读者学习! 盘古人工智能框架开发专题系列新课程https://edu.csdn.net/course/detail/31166 通过图文并茂.深入浅出的讲解 ...

最新文章

  1. 【WP8】ResourceDictionary
  2. 英伟达副总裁:生物医疗将是与 AI 结合最紧密的行业之一
  3. MySQL存储过程权限检查主要点
  4. 面经——Linux相关
  5. 2017年,这两个大数据岗位一定会火!
  6. js向页面中动态添加脚本
  7. php html 停止工作,换行符php和html无法正常工作
  8. strtus常用的一些配置
  9. (转)OAuth 2.0的设计思路
  10. VS中为非控制台程序提供控制台输出窗口
  11. python学习-02(数据类型、字符串、列表、元祖、字典)
  12. 微信公众号调取相册和摄像头功能,实现图片上传
  13. 史上最全无线通信频率分配表
  14. 解决win7 anaconda 安装 Failed to create menus
  15. 美国程序员薪水按编程语言大比拼新浪
  16. 【奈茶君】STM32F407驱动WS2812
  17. 【时序逻辑电路(sequential logic circuit)】
  18. 可调速气体采样泵和液体采样泵选型介绍
  19. Java 单例模式实现
  20. 机器学习笔记day01

热门文章

  1. 字符串处理 —— 回文串相关 —— 求最长回文子串
  2. 一个数组分成两部分,让两部分的差最小
  3. js取iframe 上级页面_原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法...
  4. ubuntu编译ubus及相关依赖库
  5. 8.0强行转换后变成了7_血糖7至8正常吗?控制标准不能一概而论,看你的血糖应该在多少...
  6. seafile安装教程 Linux,CentOS7安装seafile开源版
  7. yaml 文件内部使用变量赋值的方式_spring boot 学习笔记5(application.yaml 配置文件)...
  8. RabbitMQ集群故障恢复详解
  9. IntelAI开发平台OpenVINO
  10. Spark streaming细粒度工作原理