PHP API 框架开发的学习
基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的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,除了以上的这些还需要做的有:
- 创建一个基本的API配置文件,并修改好程序的入口。
- 配置自己想要的REST URL结构。
- 记录接口中产生的错误。~
引用地址:http://www.biaodianfu.com/php-api-framework.html
PHP API 框架开发的学习相关推荐
- java 微信api框架_Java架构学习(五十二)使用框架开发微信微信框架介绍整合微信开发框架WxJava使用微信返回消息模板接口使用WxJava框架发送模板消息http协议参数转义知识...
一.微信框架介绍 1.access_token是公众号的全局唯一调用接口的凭证,它两个小时更新一次. 获取access_token方法: https请求方式: GET https://api.weix ...
- 尚硅谷2020最新版周阳SpringCloud(H版alibaba)框架开发教程 学习笔记
前言:今天看到周阳老师出了新课,十分欣喜,很喜欢周阳老师的讲课风格,内容也充实,我也算是周阳老师忠实粉丝啦. 新出的springcloud第二版很符合我现阶段的学习需求.但美中不足的是,目前只有视频资 ...
- 使用Taro小程序框架开发一个学习、刷题、论坛、聊天交流的微信小程序
本项目小程序端采用Taro技术框架,可将React代码编译为微信小程序.安卓APP.IOS程序.H5页面等,管理端采用React Hook + TypeScript来进行开发 项目介绍 当代大学生上课 ...
- PHP_MVC框架开发,nosql学习,mysql优化,以及高并发web架构处理
文章目录 定义入口文件 完成自动加载 路由类 .htaccess explode trim array_slice 实现 控制器 加载控制器 数据库 初始化连接 数据查询函数 视图 extract 其 ...
- 从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年
文 | Peter潘欣@知乎 和深度学习框架打交道已有多年时间.从Google的TensorFlow, 到百度的PaddlePaddle,再到现在腾讯的无量.很庆幸在AI技术爆发的这些年横跨中美几家公 ...
- python django开发api_基于Django框架开发Restful api
在上篇文章中,我们讲解了restful api的主要概念,让大家有初步的了解.这一篇中,我们将通过python的Django框架,来学习开发restful 架构的接口. 一. 开发环境 开发语言:Py ...
- java若依框架开发api接口(添加新模块)
在java的spingboot框架中比较好的开源后台那必须是若依了!为了方便管理自己开发的api接口,添加自己的模块,将api接口统一管理在该模块中! 记得三连哦~ 1.下载若依admin,链接:Ru ...
- react ui框架_Web开发 React 学习(二十)连载基础篇大结局
系列文章: 测开技能--Web开发 React 学习(一) 测开技能--Web开发 React 学习(二)环境搭建 测开技能--Web开发 React 学习(三)元素的渲染 测开技能--Web开发 R ...
- 新课程盘古人工智能框架开发专题发布,智华欢迎读者学习!
新课程盘古人工智能框架开发专题发布,智华欢迎读者学习! 盘古人工智能框架开发专题系列新课程https://edu.csdn.net/course/detail/31166 通过图文并茂.深入浅出的讲解 ...
最新文章
- 【WP8】ResourceDictionary
- 英伟达副总裁:生物医疗将是与 AI 结合最紧密的行业之一
- MySQL存储过程权限检查主要点
- 面经——Linux相关
- 2017年,这两个大数据岗位一定会火!
- js向页面中动态添加脚本
- php html 停止工作,换行符php和html无法正常工作
- strtus常用的一些配置
- (转)OAuth 2.0的设计思路
- VS中为非控制台程序提供控制台输出窗口
- python学习-02(数据类型、字符串、列表、元祖、字典)
- 微信公众号调取相册和摄像头功能,实现图片上传
- 史上最全无线通信频率分配表
- 解决win7 anaconda 安装 Failed to create menus
- 美国程序员薪水按编程语言大比拼新浪
- 【奈茶君】STM32F407驱动WS2812
- 【时序逻辑电路(sequential logic circuit)】
- 可调速气体采样泵和液体采样泵选型介绍
- Java 单例模式实现
- 机器学习笔记day01
热门文章
- 字符串处理 —— 回文串相关 —— 求最长回文子串
- 一个数组分成两部分,让两部分的差最小
- js取iframe 上级页面_原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法...
- ubuntu编译ubus及相关依赖库
- 8.0强行转换后变成了7_血糖7至8正常吗?控制标准不能一概而论,看你的血糖应该在多少...
- seafile安装教程 Linux,CentOS7安装seafile开源版
- yaml 文件内部使用变量赋值的方式_spring boot 学习笔记5(application.yaml 配置文件)...
- RabbitMQ集群故障恢复详解
- IntelAI开发平台OpenVINO
- Spark streaming细粒度工作原理