##1.23.1 請求
把我們后臺的API想象成一個函數,那么請求的參數就是我們的參數列表;而接口響應的數據則對應函數返回的結果。
對于請求,正如前面所看到的,我們可以使用$_GET,也可以使用$_POST,也可以兩者都使用,還可以在測試時自己指定模擬的請求數據包。
或者,在實際項目開發中,我們還需要根據自身的需求,跟我們自己的客戶端作一些約定。如通常地,我們會要求客戶端 **service參數必須用GET方式** ,以便服務器返回500時定位接口服務位置。對此,簡單的我們把$_POST['service']去掉即可,如在入口文件前面添加:
```javascript
unset($_POST['service']); //只接收GET方式的service參數
```
###(1)在index.php入口處指定數據源
很多時間,不同的項目對數據接收有不同的需求。如簡單地,如果客戶端是通過JSON后再傳遞的話,我們可以這樣在入口處進行代碼調整:
```javascript
//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)));
```
###(2)單元測試時指定數據源
在進行單元測試時,我們需要模擬接口的請求動作,也需要提供接口參數。這時的參數的指定更為靈活。可通過以下代碼來實現,即:
```javascript
//數據源
$data = array(...);
DI()->request = new PhalApi_Request($data);
```
或者使用PhalApi封裝的測試類來快速模擬調用接口:
```
public function testIndexByRunner()
{
//Step 1. 構建請求URL
$url = 'service=Default.Index&username=dogstar';
$params = array();
//Step 2. 執行請求
$rs = PhalApi_Helper_TestRunner::go($url, $params);
```
###(3)接口數據的加密傳送
有時,出于安全性的考慮,項目需要對請求的接口參數進行對稱加密傳送。這時可以通過重載PhalApi_Request::genData()來輕松實現。
假設,我們現在需要把全部的參數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';
```
然后,就可以輕松實現了接口參數的對稱加密傳送。
至此,你也許已經發現:指定數據源和對稱加密是可以結合來使用的。
##1.23.2 響應
當前默認使用JSON的格式返回,但項目需要其他返回格式也是可以的。只需要實現PhalApi_Response抽象中的formatResult($result)格式化返回結果,然后也是重新注冊DI()->response服務即可。如:
###(1)JSONP的返回
在H5頁面中,我們可能會需要用到JSONP的返回,所以這里默認提供了這種格式的支持。
在入口文件中,添加:
```javascript
//支持JsonP的返回
if (!empty($_GET['callback'])) {
DI()->response = new PhalApi_Response_JsonP($_GET['callback']);
}
```
在接口訪問時再帶上&callback=XXX參數即可。
這里在創建響應服務時,可以看到是用了回調函數的名字進行初始化。考慮到會存在XSS(跨站腳本攻擊),對回調函數要進行相應的過濾,可以用黑名單或者白名單的方式。黑名單方式暫時還沒提供,白名單相對簡單但需要項目自己實現,如:
```javascript
class Common_JsonP extends PhalApi_Response_JsonP {
protected function clearXss($callback) {
return in_array($callback, array('fun1', 'func2', 'func3')) ? $callback : '';
}
}
```
###(2)其他格式返回
如上面所述,當需要返回一種當前PhalApi沒提供的格式時,可以:
+ 1、實現PhalApi_Response抽象中的formatResult($result)格式化返回結果
+ 2、重新注冊DI()->response服務
這里以擴展XML返回格式為例,簡單說明。
首先,添加實現一個XML響應子類:
```javascript
<?php
class Common_Response_XML extends PhalApi_Response {
protected function formatResult($result) {
return ArrayToXML::toXml($result);
}
}
```
關于ArrayToXML,請查看: [將PHP數組轉成XML](http://www.oschina.net/code/snippet_54100_1548)
然后,重新注冊:
```javascript
DI()->response = new Common_Response_XML();
```
done!
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板