#phalapi-入門篇3(請求和返回)#

##前言##
***先在這里感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.***
這一小節主要講一下請求(參數驗證),返回(怎么返回自己想要的結果),官方文檔也有比較詳細的說明所以在有些比較基礎的地方就一筆帶過,講一點比較實用在項目開發中怎么使用phalapi框架定制出自己想要的請求和返回結果.
請先通讀:
[1.12] 參數規則:接口參數規則配置
[1.13] 統一的接口請求方式:?sevice=XXX.XXX
[1.14] 統一的返回格式和結構:ret data msg
附上:
喵了個咪的博客:[w-blog.cn](w-blog.cn)
官網地址:[http://www.phalapi.net/](http://www.phalapi.net/ "PhalApi官網")
開源中國Git地址:[http://git.oschina.net/dogstar/PhalApi/tree/release](http://git.oschina.net/dogstar/PhalApi/tree/release "開源中國Git地址")
##1. 請求##
稍微看過Demo代碼的童鞋和讀了官方文檔的童鞋應該都已經知道,請求參數驗證是通過模塊文件中的**getRules**方法進行過濾校驗的

當然還有**default**默認值,默認值一般不和requie同時出現,基本上有了這些框架自帶的參數過濾校驗基本上可以滿足大家的需求,
在代碼層面使用$this->參數名就能獲取到請求的值(這里建議請求的參數名與獲取的參數名,名稱保持一致避免因為名稱混淆導致的出錯)
那么具體的業務需求來了,大家都知道get請求不安全一般要是傳遞參數都需要使用post請求,在phalapi中自帶接受請求機制是**接受_REQUEST**
也就是get請求和post請求通通接受,怎么做到只接受post參數而不接受get參數呢
官方文檔有說:

但是這樣有個弊端,包括接口名稱在內的service參數許必須用post請求傳遞才能生效,可以在init.php的最前面加上想從get獲取的參數負值給post(**$_POST['service'] = $_GET['service'];**)但是不是很推薦這樣使用,如果要從根本上解決問題就需要使用自定義的攔截器了(**如何搭建使用攔截器會在后面的進階篇的項目實踐講到**)
##2. 返回##
###2.1 定制成功返回結果###
返回我么用個最簡單的例子說明,就是官方自帶的默認方法

大家可以看下代碼層
public function index() {
return array(
'title' => 'Hello World!',
'content' => T('Hi {name}, welcome to use PhalApi!', array('name' => $this->username)),
'version' => PHALAPI_VERSION,
'time' => $_SERVER['REQUEST_TIME'],
);
}
在接口榮return的內容是在返回值的data參數里面(這樣已經是一個約定俗成的規范了)
那么有的人就說了msg里面怎么沒有值啊,如果是登錄成功了是不是應該返回登錄成功的提示?其實這些都是已經封裝好的方法大家在Default.index接口的最前面加上**DI()->response->setMsg('獲取參數成功');**就能看到如下返回:

這樣就有了,那么又有的人說了ret和msg的名字可以修改嗎(這種情況經常出現因為要兼容老業務,或者公司內部已經約定俗成)當然是能修改的,大家打開**/PhalApi/Response.php**這個文件里面可以看到一個**getResult**方法
public function getResult() {
$rs = array(
'ret' => $this->ret,
'data' => $this->data,
'msg' => $this->msg,
);
return $rs;
}
這里就可以定義返回的key是什么我們把ret改成code就能得到如下返回

那么如果成功的表示是1怎么辦?在Response.php開頭就有一個變量設置了成功的返回值位200大家可以根據自己的需求改成任何想要的返回值.
/**
* @var int $ret 返回狀態碼,其中:200成功,400非法請求,500服務器錯誤
*/
protected $ret = 200;
###2.2 失敗了返回###
講了這么多都是圍繞著成功所說的,當然我們經常會遇到失敗的情況我們要如何應對呢?大家試著在**Default.index**接口前面加上如下一段代碼:
throw new PhalApi_Exception_BadRequest('失敗了');
會得到如下結果:

這就是所謂的報錯機制當然這個報錯機制也是可以定制的,大家可以進入到**PhalApi_Exception_BadRequest**看一下
class PhalApi_Exception_BadRequest extends PhalApi_Exception{
public function __construct($message, $code = 0) {
parent::__construct(
T('Bad Request: {message}', array('message' => $message)), 400 + $code
);
}
}
失敗默認$code是0+400,如果你在'失敗了'后面加上一個參數
throw new PhalApi_Exception_BadRequest('失敗了',1);
那么code就會返回401,當然你也可以去掉默認的+400那么就會返回你輸入的值了,具體也是看業務需求
##3. 總結##
從本小節可以看出phalapi框架確實很靈活完全可以按照自己定義想要的業務需求,而且報錯機制也非常優雅,在本節后也希望大家能動手去嘗試一下各種各樣不同的請求以及返回,下一小節會講返回結果國際化高可用以及自動生成文檔.
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
**官網QQ交流群:421032344 歡迎大家的加入!**
####[上一章](/wikis/%5b7.2%5d-phalapi-%e5%85%a5%e9%97%a8%e7%af%872(%e6%8a%8a%e5%ae%83%e7%8e%a9%e8%b5%b7%e6%9d%a5).html) [文檔首頁](/wikis/) [下一章](/wikis/%5b7.4%5d-phalapi-%e5%85%a5%e9%97%a8%e7%af%874(%e5%9b%bd%e9%99%85%e5%8c%96%e9%ab%98%e5%8f%af%e7%94%a8%e5%92%8c%e8%87%aa%e5%8a%a8%e7%94%9f%e6%88%90%e6%96%87%e6%a1%a3).html)
- 空白目錄
- [7.1]-phalapi-入門篇1(簡單介紹以及環境搭建)
- [7.2]-phalapi-入門篇2(把它玩起來)
- [7.3]-phalapi-入門篇3(請求和返回)
- [7.4]-phalapi-入門篇4(國際化高可用和自動生成文檔)
- [7.5]-phalapi-入門篇5(數據庫操作和Model層)
- [7.6]-phalapi-入門篇6(小技巧和淺談API適用范圍以及入門篇總結)
- [7.7]-phalapi-進階篇1(三層結構Api,Domain,和Model)
- [7.8]-phalapi-進階篇2(DI依賴注入和單例模式)
- [7.9]-phalapi-進階篇3(自動加載和攔截器)
- [7.10]-phalapi-進階篇4(notorm進階以及事務操作)
- [7.11]-phalapi-進階篇5(數據庫讀寫分離)
- [7.12]-phalapi-進階篇6(解決大量數據存儲數據庫分表分庫拓展)
- [7.13]-phalapi-進階篇7(使用緩存以及用redis拓展解決實際問題)
- [7.14]-phalapi-進階篇8(PhalApi能帶來什么和進階篇總結)