W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
把我們后臺的API想象成一個函數(shù),那么請求的參數(shù)就是我們的參數(shù)列表;而接口響應的數(shù)據(jù)則對應函數(shù)返回的結(jié)果。
對于請求,正如前面所看到的,我們可以使用$_GET,也可以使用$_POST,也可以兩者都使用,還可以在測試時自己指定模擬的請求數(shù)據(jù)包。
或者,在實際項目開發(fā)中,我們還需要根據(jù)自身的需求,跟我們自己的客戶端作一些約定。如通常地,我們會要求客戶端 service參數(shù)必須用GET方式 ,以便服務器返回500時定位接口服務位置。對此,簡單的我們把$_POST['service']去掉即可,如在入口文件前面添加:
unset($_POST['service']); //只接收GET方式的service參數(shù)
很多時間,不同的項目對數(shù)據(jù)接收有不同的需求。如簡單地,如果客戶端是通過JSON后再傳遞的話,我們可以這樣在入口處進行代碼調(diào)整:
//vim ./index.php
$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : "{}";
DI()->request = new PhalApi_Request(array_merge($_GET,json_decode($HTTP_RAW_POST_DATA, true)));
在進行單元測試時,我們需要模擬接口的請求動作,也需要提供接口參數(shù)。這時的參數(shù)的指定更為靈活。可通過以下代碼來實現(xiàn),即:
//數(shù)據(jù)源
$data = array(...);
DI()->request = new PhalApi_Request($data);
或者使用PhalApi封裝的測試類來快速模擬調(diào)用接口:
public function testIndexByRunner()
{
//Step 1. 構(gòu)建請求URL
$url = 'service=Default.Index&username=dogstar';
$params = array();
//Step 2. 執(zhí)行請求
$rs = PhalApi_Helper_TestRunner::go($url, $params);
有時,出于安全性的考慮,項目需要對請求的接口參數(shù)進行對稱加密傳送。這時可以通過重載PhalApi_Request::genData()來輕松實現(xiàn)。
假設,我們現(xiàn)在需要把全部的參數(shù)base64編碼序列化后通過_POST['data']來傳遞,則相應的解析代碼如下。
第一步,先定義自己的擴展請求類,在里面完成對稱解析的動作:
<?php
class Common_Request extends PhalApi_Request {
public function genData($data) {
if (!isset($data) || !is_array($data)) {
return $_POST; //改成只接收POST
}
$postData = isset($data['data']) ? base64_decode($data['data']) : array();
}
}
第二步,在index.php入口文件中重新注冊請求類(即添加以下代碼):
//重新注冊request
DI()->request = 'Common_Request';
然后,就可以輕松實現(xiàn)了接口參數(shù)的對稱加密傳送。
至此,你也許已經(jīng)發(fā)現(xiàn):指定數(shù)據(jù)源和對稱加密是可以結(jié)合來使用的。
當前默認使用JSON的格式返回,但項目需要其他返回格式也是可以的。只需要實現(xiàn)PhalApi_Response抽象中的formatResult($result)格式化返回結(jié)果,然后也是重新注冊DI()->response服務即可。如:
在H5頁面中,我們可能會需要用到JSONP的返回,所以這里默認提供了這種格式的支持。
在入口文件中,添加:
//支持JsonP的返回
if (!empty($_GET['callback'])) {
DI()->response = new PhalApi_Response_JsonP($_GET['callback']);
}
在接口訪問時再帶上&callback=XXX參數(shù)即可。
這里在創(chuàng)建響應服務時,可以看到是用了回調(diào)函數(shù)的名字進行初始化??紤]到會存在XSS(跨站腳本攻擊),對回調(diào)函數(shù)要進行相應的過濾,可以用黑名單或者白名單的方式。黑名單方式暫時還沒提供,白名單相對簡單但需要項目自己實現(xiàn),如:
class Common_JsonP extends PhalApi_Response_JsonP {
protected function clearXss($callback) {
return in_array($callback, array('fun1', 'func2', 'func3')) ? $callback : '';
}
}
如上面所述,當需要返回一種當前PhalApi沒提供的格式時,可以:
這里以擴展XML返回格式為例,簡單說明。
首先,添加實現(xiàn)一個XML響應子類:
<?php
class Common_Response_XML extends PhalApi_Response {
protected function formatResult($result) {
return ArrayToXML::toXml($result);
}
}
關(guān)于ArrayToXML,請查看: 將PHP數(shù)組轉(zhuǎn)成XML
然后,重新注冊:
DI()->response = new Common_Response_XML();
done!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: