基于互聯(lián)網(wǎng)的應(yīng)用正變得越來越普及,在這個過程中,有更多的站點(diǎn)將自身的資源開放給開發(fā)者來調(diào)用。對外提供的API 調(diào)用使得站點(diǎn)之間的內(nèi)容關(guān)聯(lián)性更強(qiáng),同時(shí)這些開放的平臺也為用戶、開發(fā)者和中小網(wǎng)站帶來了更大的價(jià)值。 在開發(fā)API前,你需要的是給API設(shè)定一個框架,這個框架一定是要簡單的且是容易擴(kuò)展的。下面就是用就來看看如何使用PHP來創(chuàng)建一個API。 API框架需要的特性
API框架的組成部分 API Framework主要由下面三中類型元素組成:
在一個運(yùn)行的API中,每種類型的元素都有其自己的任務(wù)。下面就來詳細(xì)說說每一種元素。 通常的API請求URL如下: http://www./api/version/service/method/param_name/param_key.extension ServiceService Class是API請求的控制器。這個Class包含了API可以使用的method,所以Service Class會需要計(jì)算和處理數(shù)據(jù)。 為了使method可以被請求,你需要將method設(shè)置為公開(public),并為service method設(shè)置請求類型(GET, POST, PUT, DELETE)。 下面是一個Service Class的類,你可以設(shè)置默認(rèn)的請求方式為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請求類型:
如果你希望方法( method)名以駝峰式命名的話,如: public myNewHelloWorld{} 那么你就需要在你的url中使用”my-new-hello-world”來請求這個方法(/v1/helloworld/my-new-hello-world.xml)。 Hook Hook是一個可以綁定特定行為的類。哪些Hooks 會在執(zhí)行力中執(zhí)行特定的點(diǎn)(如圖所示)。它可以讓你在服務(wù)使用前修改數(shù)據(jù)。下面是一些可能的hook示例:
上面的只是一些示例,你可以發(fā)揮你的想象任意的添加Hook。下面是一個關(guān)于Hook的實(shí)例: 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了:
如果要啟用鉤子則需要到程序的入口(endpoint.php)進(jìn)行修改。 Parsers解析器用來轉(zhuǎn)化數(shù)據(jù)到特定的輸出格式的。例如是XML,機(jī)械器就是用定義的APi請求文件擴(kuò)展名來表示。例如:
你可以根據(jù)自己的需求定義標(biāo)準(zhǔn)的解析器,如:
下面是一種類似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); } } 框架會根據(jù)命名規(guī)則自動尋找適合的輸出格式。 要順利的開發(fā)一個PHP API,除了以上的這些還需要做的有:
Related posts: |
|