|
您的下一個 php/MySQL 項(xiàng)目可能與您最近完成的十幾個項(xiàng)目類似:建立一個 MySQL 數(shù)據(jù)庫,創(chuàng)建包含 HTML 的 php 視圖,根據(jù)需要添加 JavaScript 代碼和 CSS 文件,連接到數(shù)據(jù)庫,從數(shù)據(jù)庫提取內(nèi)容來填充視圖,等等。如果您熟悉 web 開發(fā),您一定知道分隔功能代碼的好處。例如,您知道要避免直接在視圖中輸入原始 SQL 查詢,不會在從數(shù)據(jù)庫提取數(shù)據(jù)的函數(shù)或類中混淆 HTML 標(biāo)記。
但是,有時,您的項(xiàng)目可能擴(kuò)展到您的正常 php/MySQL 舒適水平之外。例如,您可能不僅擁有需要來自一個數(shù)據(jù)庫的數(shù)據(jù)的常規(guī) web 視圖,還擁有外部應(yīng)用程序(比如 Facebook),甚至還擁有訪問相同數(shù)據(jù)的移動設(shè)備(比如智能手機(jī))。
您可能會發(fā)現(xiàn)自己身陷這樣一種情況:數(shù)據(jù)庫更改,或者要求您處理某種類型的 XML 存儲庫。在這些情況下,您對 MySQL 的盲目依賴可能會阻礙您完成項(xiàng)目的工作。
可以考慮將一個 RESTful JSON 控制器放置到您的項(xiàng)目中,將它用作一個虛擬交通警察,負(fù)責(zé)發(fā)送請求并接收來自您的數(shù)據(jù)源的響應(yīng)。本文將介紹 REST 和 JSON 的基礎(chǔ)知識,并展示一種建立控制器的方法。其結(jié)果是從一個數(shù)據(jù)源檢索數(shù)據(jù)的簡單方法,檢索的數(shù)據(jù)采用標(biāo)準(zhǔn)化的格式,可以使用 php 或 JavaScript 代碼輕松解析。
什么是 REST?
在一個典型的 REST 架構(gòu)中,一個客戶機(jī)發(fā)送一個請求到服務(wù)器,服務(wù)器使用請求資源的一個表示來進(jìn)行響應(yīng)。資源可以是任何信息對象,比如數(shù)據(jù)庫或文檔,它的表示通常是一個格式化的文檔(通常是 XML 或 JSON),充當(dāng)它的當(dāng)前或被請求狀態(tài)的一個快照。
REST 資源通常使用有意義的 URLs 標(biāo)識,這些 URLs 接受不同的請求動詞 GET、POST、PUT 和 DELETE。這些動詞有點(diǎn)類似于許多開發(fā)人員都熟悉的 create-retrieve-update-delete (CRUD) 模型。
例如,如果您想檢索數(shù)據(jù),則使用 GET 請求;要創(chuàng)建數(shù)據(jù),則使用 POST 請求;要更新數(shù)據(jù),則使用 PUT 請求;最后,要刪除數(shù)據(jù),則使用 DELETE 請求。
另一個需要考慮的重要因素是響應(yīng)。RESTful 服務(wù)通常在它的響應(yīng)中提供兩個有意義的組件:響應(yīng)主體本身和一個狀態(tài)碼。許多 REST 服務(wù)實(shí)際上允許用戶指定一個響應(yīng)格式(比如 XML、CSV、序列化的 php 對象或純文本),方法有兩種:一是發(fā)送一個 ACCEPT 參數(shù);二是指定一個文件擴(kuò)展名(例如,/api/users.xml 或 /api/users.json)。其他 REST 服務(wù)器,比如您將在這里實(shí)現(xiàn)的服務(wù)器,擁有硬編碼的響應(yīng)格式。這些格式同樣可以接受,只要它們已經(jīng)有文檔記載。
響應(yīng)代碼往往是 HTTP 狀態(tài)碼。這種模式的優(yōu)點(diǎn)是可以使用知名的現(xiàn)有狀態(tài)碼來標(biāo)識錯誤或成功。狀態(tài)碼 201(CREATED)是一個成功 POST 請求的完美響應(yīng)。錯誤碼 500 表明在您所處的這端(服務(wù)端)上發(fā)生了錯誤,但錯誤碼 400 表明客戶端上出現(xiàn)了失敗(BAD REQUEST)。如果服務(wù)器出現(xiàn)故障,將發(fā)送錯誤碼 503(SERVICE UNAVAILABLE)。
研究一下下面這個示例:一個應(yīng)用程序擁有的一個數(shù)據(jù)源包含一些用戶信息,名、姓、郵件地址、以及Twitter 帳戶。如果您正在設(shè)置一個典型的 php 應(yīng)用程序,您需要創(chuàng)建一個 mysql_query() 包裝器來使用一個 SQL 查詢從數(shù)據(jù)庫提取一個清單。您還需要編寫一些 php 代碼,用于調(diào)用那個函數(shù)并循環(huán)結(jié)果集,以便在應(yīng)用程序視圖中顯示數(shù)據(jù)。
一個更簡單的方法是設(shè)置一個簡單的 REST 控制器,該控制器允許一個針對 /users/list 的、不帶任何參數(shù)的 GET 請求,然后調(diào)用適當(dāng)?shù)臄?shù)據(jù)庫函數(shù)并返回一個 JSON 格式的清單。接下來,您的應(yīng)用程序可以解碼那個 JSON 數(shù)據(jù),以任何必要的方式循環(huán)該數(shù)據(jù),以便顯示數(shù)據(jù)內(nèi)容。
另外,您可以通過測試檢查是否有任何參數(shù)被發(fā)送到 /users/list。例如,如果您發(fā)送一個 GET 請求到 /users/list/1,那么響應(yīng)將只包含 ID 為 1 的用戶的細(xì)節(jié)。除 JSON 格式外,您甚至可以允許其他格式,比如 XML、CSV 和的 php 對象。
一個 RESTful JSON 控制器對于您的開發(fā)工作的作用并非僅僅是在視圖和數(shù)據(jù)源之間放置一個額外的功能層。想想看,您的基本 php 視圖也許不是請求信息的惟一組件。例如,您可能會使用 jQuery 通過一個 Ajax 接口請求數(shù)據(jù),或者,您的用戶可能會通過一部智能手機(jī)或一個 Facebook 應(yīng)用程序請求數(shù)據(jù)。
在這些情況下,一個接收請求并以一種容易理解(和預(yù)測)的格式提供響應(yīng)的 RESTful 接口可能會極大地簡化您的開發(fā)工作。作為負(fù)責(zé) php 視圖(或者甚至 iPhone 應(yīng)用程序)的開發(fā)人員,您可以發(fā)送一些請求到一個 URL 并接收一組預(yù)期響應(yīng)。在 JSON 控制器的另一面,應(yīng)用程序可以被鉤掛(hook)到 MySQL、PostgreSQL、一個 XML 文件存儲庫、或者什么也不掛。
什么是 JSON?
JSON 是一種基于文本的輕量級數(shù)據(jù)交換格式,便于人類和計算機(jī)輕松理解和使用。在其出現(xiàn)之初,JSON 設(shè)計用于表示簡單數(shù)據(jù)結(jié)構(gòu)。盡管它最初被視為用于傳輸特定的 JavaScript 友好數(shù)據(jù)的一種方法,但現(xiàn)在幾乎每臺計算機(jī)上都有針對它的解析器。在 php 中,一對原生 JSON 函數(shù)(json_encode 和 json_decode)將幫助您執(zhí)行大量繁重的提升。只要將一組數(shù)據(jù)(或者甚至一個簡單字符串)發(fā)送到 json_encode,一個 JSON 對象將出現(xiàn)(如 清單 1 所示)。
清單 1. 一個 php 數(shù)組 vs. 一個 JSON 對象
'firstname'=>'Tom',
'lastname'=>'Smith',
'age'=>40
);
print_r($data);
/* prints
Array(
[firstname] => Tom
[lastname] => Smith
[age] => 40
)
*/
echo json_encode($data);
/* prints
{ "firstname": "Tom",
"lastname": "Smith",
"age":40
}
*/
it知識庫:為您的Web項(xiàng)目構(gòu)建一個簡單的JSON控制器,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。