PHP API 框架開發

最近一直在寫一些api讓別人去調用來獲取咱們公司網站的數椐,但一直沒想過api的構架,之後能夠會有更多的api需求,因此須要構架一下了。php

基於互聯網的應用正變得愈來愈普及,在這個過程當中,有更多的站點將自身的資源開放給開發者來調用。對外提供的API 調用使得站點之間的內容關聯性更強,同時這些開放的平臺也爲用戶、開發者和中小網站帶來了更大的價值。 在開發API前,你須要的是給API設定一個框架,這個框架必定是要簡單的且是容易擴展的。下面就是用就來看看如何使用PHP來建立一個API。 API框架須要的特性 面向對象和結構化的代碼 可修改的URL結構 建立多個版本 使用Hook來擴展框架API功能 API可鏈接數據庫表 可定義多種輸出格式 選擇方法請求類型(GET, POST, PUT, DELETE) API框架的組成部分 API Framework主要由下面三中類型元素組成: Services Hooks Parsers 在一個運行的API中,每種類型的元素都有其本身的任務。下面就來詳細說說每一種元素。數據庫

![在此輸入圖片描述][1]json

一般的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請求。api

<?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 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{ public $content_type = "text/plain"; public function parse(){ return print_r($this->_data, true); } } 框架會根據命名規則自動尋找適合的輸出格式。 要順利的開發一個PHP API,除了以上的這些還須要作的有: 建立一個基本的API配置文件,並修改好程序的入口。 配置本身想要的REST URL結構。 記錄接口中產生的錯誤。~ [1]: http://static.oschina.net/uploads/space/2013/0518/141648_S9Zf_137226.jpg框架

相關文章
相關標籤/搜索