设为首页 收藏本站
查看: 507|回复: 0

[经验分享] PHP API 框架开发的学习

[复制链接]

尚未签到

发表于 2015-8-28 10:59:18 | 显示全部楼层 |阅读模式
  基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的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
<?phpclass 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";}}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24


<?php
classMyApi_Service_HelloworldextendsApi_Service_IService{

publicfunction__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);

}

publicfunctionexecute($params,$config){
$this->code=200;
return"Hello world";
}

publicfunctionversion($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的实例:



PHP
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.');}}}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24


classApi_Hook_BlockIpextendsApi_Hook_IHook{

publicfunctionexecute(){

// 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)){
   thrownewApi_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的输出格式示例:



PHP
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);}}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


classApi_Parser_PrintrextendsApi_Parser_IParser{

/**
* Content type
* @var string
*/
public$content_type="text/plain";

/**
* Parse to XML
*
* @return string
*/
publicfunctionparse(){
returnprint_r($this->_data,true);
}

}
  框架会根据命名规则自动寻找适合的输出格式。
  要顺利的开发一个PHP API,除了以上的这些还需要做的有:

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105449-1-1.html 上篇帖子: Rasmus Lerdorf---PHP's Creator 下篇帖子: lighttpd+php安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表