http://www.oschina.net/translate/creating-an-api-centric-web-application?from=20130818php
正計劃着要開始搞一個新的網絡應用?在這篇教程中,咱們將討論如何建立以API爲中心的網絡應用,還會解釋在今天的多平臺世界,這類應用爲何是重要的。css 引言API?html 對於還不甚熟悉這個術語的朋友,API是Application Programming Interface(應用編程接口)的簡稱。根據維基百科:前端 API是以源代碼爲基礎的約定,它用於軟件組件之間相互通訊的接口。API可能包含函數、數據結構、對象類、以及變量等的約定。 API可視化jquery 簡單地講,API指的是一組應用中的函數,它們可以被其它應用(或者這些函數所屬應用本身,下文中咱們將會看到)用來與應用進行交互。API是一種很棒的向外部應用安全和妥善地代表其功能的方式,由於這些外部應用所能利用的全部功能僅限於API中所表現出的功能。github |
stoneyang
|
什麼是「以API爲中心的」網絡應用?以API爲中心的網絡應用就是基本上經過API調用執行大多數甚或全部功能的一類網絡應用。 以API爲中心的網絡應用就是基本上經過API調用執行大多數甚或全部功能的一類網絡應用。舉個例子,若是你正要登陸一個用戶,你應當將其認證信息發送給API,而後API會向你返回一個結果,說明該用戶是否提供了正確的用戶名-密碼組合。編程 以API爲中心的網絡應用的另一個特徵就是API一直是無狀態的,這意味着這種應用沒法辨別由會話發起的API調用。因爲API調用一般由後端代碼構成,實現對會話的掌控將比較困難,由於這其中一般沒有cookies介入。這種侷限事實上是好事——它「迫使」開發者建造不基於當前用戶狀態工做的API,可是相應地在功能上,它使測試易於進行,由於用戶的當前狀態無需被重建。 |
stoneyang
|
爲何要經歷這些麻煩?做爲Web開發者,咱們已經親眼目擊了技術的進步。有一個常識是,當代的人們不會只經過瀏覽器來使用應用,還會經過其它諸如移動電話和平板電腦之類的設備使用。舉個例子,這篇發表在Mashable上的名爲「用戶在移動應用上花的時間比在網絡上的多」的寫道: 一項新近的報告代表,用戶花在移動應用上的時間首次超過了花在網絡上的時間。
這裏還有一篇來自ReadWriteWeb的更新的文章「在移動設備上瀏覽網絡的人多於使用IE6和IE7的人數總和」: 來自Sitepoint的 瀏覽器趨勢的最新數據代表,在智能手機上瀏覽Web的人比使用IE6和IE7瀏覽的人更多。這兩件難有轉機的老古董多年來一直是Web開發者的噩夢,它們須要各網站儘量穩當地降格到至少經常使用瀏覽器所能支持的水平。可是如今時代不一樣了;2011年十一月中,6.95%的Web活動在移動瀏覽器上發生,而發生在IE6或IE7上的則只有6.49%。 正如咱們所見,愈來愈多的人正經過其它途徑得到訊息,特別是移動設備。 |
stoneyang
|
這與我建立以API爲中心的網絡應用有何關係?這必將會使咱們的應用更加有用,由於它能夠用在任何你須要的地方。 建立以API爲中心的網絡應用的主要優點之一即是它幫助你創建能夠用於任何設備的功能,瀏覽器、移動電話、甚至是桌面應用。你所須要作的就是建立的API可以使全部這些設備利用它完成通訊,而後,瞧!你將可以建造一個集中式應用,它可以接受來自用戶所使用的任何設備的輸入並執行相應的功能。 以API爲中心的應用的框圖 |
stoneyang
|
經過以這種方式建立應用,咱們可以從容地利用不一樣的人使用不一樣的媒介這一優點。這必將使應用更加有用,由於它能用在用戶須要的任何地方。 爲了證實咱們的觀點,這裏有一篇關於Twitter的從新設計的網站的文章,文章告訴咱們他們如今如何利用他們的API來驅動Twitter.com的,實質上是使其以API爲中心: 最重要的架構改動之一就是Twitter.com如今是咱們本身API的客戶。它從終端提取數據,此終端與移動網站,咱們爲iPhone、iPad、Android,以及全部第三方應用所用端點相同。這一轉變使咱們能向API團隊分配更多的資源,同時生成了40多個補丁。在初始頁面負載和來自客戶端的每一個調用上,全部的數據如今都是從一個高度優化的JSON段緩存中獲取的。 在本篇教程中,咱們將建立一個簡單的TODO列表應用,該應用以API爲中心;還要建立一個瀏覽器上的前端客戶端,該客戶端與咱們的TODO列表應用進行交互。文末,你就能瞭解一個以API爲中心的應用的有機組成部分,同時,還能瞭解怎樣使應用和客戶端二者之間的安全通訊變得容易。記住這些,咱們開始吧! |
stoneyang
|
步驟 1: 規劃該應用的功能本教程中咱們將要構建的這個 TODO 應用將會有下面幾個基本的CRUD功能:
每個 TODO 條目將擁有:
讓咱們模擬一下該應用,使咱們考慮該應用之後會是什麼樣子時,能有有一個直觀的參考: 簡單的TODO 模擬示例 |
lwei
|
步驟 2: 建立API服務器既然咱們是在開發一個以API爲中心的應用,咱們將建立兩個「項目」: API 服務器,和前端客戶端。 咱們首先從建立API服務器開始。 在你的web server文件夾,建立一個文件夾,命名爲simpletodo_api,而後建立一個index.php文件。這個index.php文件將做爲一個訪問API的前端控制器,因此,全部訪問API服務器的請求都會由該文件產生。打開它並往裏輸入下列代碼:
實質上,這裏咱們建立的是一個簡單的前端控制器,它實現了下列功能:
|
lwei
|
除了須要建立index.php外你還須要建立三個文件夾:
controllers,
models 和
data.
在controllers文件夾下建立一個叫Todo.php的文件。這將是任何TODO列表有關任務的控制器。按照TODO應用所需提供的功能,向Todo控制器裏面添加必要的方法:
如今爲每一個action中添加必要的功能實現。我將會提供createAction()方法的源碼,其餘方法將留做做業。若是你以爲毫無頭緒,你也能夠下載示例的源碼,從那裏拷貝。
|
bigtiger02
|
在文件夾models下建立TodoItem.php,這樣咱們就能夠建立「條目添加」的代碼了。注意:我並無和數據庫進行鏈接,相反我將信息保存到文件中,雖然這能夠用任何數據庫來實現,可是
這樣作相對來講要容易些。
createAction方法使用到TodoItem模型裏面兩個方法:
因爲API須要經過HTTP請求調用,在瀏覽器輸入以下地址測試API: 若是沒有錯,你應該在data文件夾下看到一個新的文件夾,在該文件夾裏面有一個文件,文件內容以下: createAction()結果 恭喜!您已經成功建立了一個的API服務器和API調用! |
bigtiger02
|
步驟3:確保API服務器具備APP ID和APP SECRET目前,API服務器被設置爲接受所有API請求。咱們將須要將之限制在咱們本身的應用上,以確保只有咱們本身的前端客戶端可以完成API請求。另外,你實際上也能夠建立一個系統,其中的用戶能夠建立他們本身的應用,而那些應用也用用對你的API服務器的訪問權,這與Facebook和Twitter的應用的的工做原理相似。 咱們從爲使用API服務器的用戶建立一組id-密碼對開始。因爲這只是一個Demo,咱們可使用任何隨機的、32位字符串。對於APP ID,咱們將其設定爲APP001。 再次打開index.php文件,而後用下列代碼更新之:
|
stoneyang
|
咱們在這裏已經完成的其實是實現一個很是簡單的認證咱們的前端客戶端的方法,它利用了與公共-私有密鑰認證類似的系統。基本上,這裏給出的就是認證過程的步驟分解: 公鑰加密
既然API服務器已經確保具備APP ID和APP SECRET,那麼咱們就能夠開始編寫使用API服務器的前端客戶端了。 |
stoneyang
|
步驟4:建立瀏覽器客戶端咱們從爲前端客戶端設定新建文件夾開始。在你的Web服務器上的文件夾中建立一個名爲simpletodo_client_browser的文件夾。完成後,建立一個index.php文件,並將下列代碼寫進去:
SimpleTODO的登陸頁 須要注意的是我在這裏已經包含了兩個JavaScript文件和兩個CSS文件:
接下來,咱們建立login.php文件來存儲客戶端會話中的用戶名和密碼。
這裏,咱們簡單地爲用戶開啓一次會話,所依據的是用戶所提供的用戶名和密碼組合。這充當了簡單的組合密鑰,它容許用戶訪問某個特定用戶名和密碼組合所存儲的TODO項。而後咱們重定向至todo.php,那裏是咱們開始與API服務器交互的地方。然而在咱們開始編寫todo.php文件以前,先建立一個 ApiCaller類,它將封裝咱們所需的所有API調用方法,包括請求的加密。 建立apicaller.php,並把下面的代碼寫進去:
|
stoneyang
|
咱們將利用ApiCaller類向咱們的API服務器發送請求。這樣,全部必需的加密和cURL初始化代碼將會寫在一個地方,咱們就不用重複代碼了。
如今,咱們開始寫todo.php。首先,咱們建立一些代碼來爲密碼爲test1234的用戶nikko(這是咱們先前用來測試API服務器的那個用戶名/密碼組合)獲取當前的todo項。
恭喜,你已經成功地作好了一個向API服務器的API調用!在這段代碼中,咱們已經:
|
stoneyang
|
如今,咱們來從新格式化一下數據,讓它們開起來更好看些。向todo.php中添加下列HTML。別忘了移去var_dump()!
很酷哈?但它目前啥也幹不了,那麼讓咱們開始添加一些功能吧。我將爲new_todo.php提供代碼,它們調用todo/createAPI調用來建立新的TODO項。建立其餘頁(update_todo.php和delete_todo.php)應該與此十分類似,所以我把它們留給你。打開new_todo.php,而後把下面的代碼添進去:
恭喜,它好用了!你已經成功地建立了一個以API爲中心的應用! |
stoneyang
|
結論圍繞API建立並開發應用具備如此之多的優點。想建立一個Android版的SimpleTODO?你須要的全部功能都已經在API服務器上了,因此你所要作的就是建立客戶端!想重構或者優化某些類?沒問題——只要確保輸出相同便可。想添加更多的功能?你能夠在不影響任何客戶端代碼的前提下作到! 儘管存在着某些像是更長的開發時間或者更加複雜,可是以這種方式開發網絡應用的優點卻遠比其劣勢更重要。今天的這種開發由咱們本身權衡取捨,從而使咱們可以在未來獲益。 你是準備使用一臺API服務器做爲你的下一個Web應用,仍是已經在過去的項目中使用了相同的技術?請在評論中告知! |