引語:現在互連網那麼熱,你手裡沒幾個APP都不好意思跟別人打招呼!但是,難道APP就是全能的神嗎?答案是否定的,除了優雅的APP前端展示,其實核心還是伺服器端。資料的儲存、查詢、訊息的推送,無不是在伺服器端完成的,默默地!那麼,怎樣提供一個服務端介面就是一個至關重要的問題了!
也許你會說,現在APP這麼泛濫,誰還不會寫服務端API程式啊?是的,也許,你是對的,但是本文想說明的和要講的故事,是一個從零到一故事,是一個思想,是一個曆程,一個可以推演的過程!
在給出答案之前,先拋幾個問題,如果你自認為這些方面都做得很優秀,那麼恭喜你,你已經是牛人了!請於文後留下你的箴言以供借鑒,多謝!如果你感覺還有待提高的,可以嘗試在這裡找找答案,不謝!(註:本人使用PHP語言進行開發,但這不重要)
1、採用什麼樣的伺服器進行提供服務(也許不太準確)?如:soap server ? yar server ? restful ? 好吧,我相信你肯定是用的restful風格的,因為這個才是王道!
2、怎樣確定訪問來路是正常的,或者說你怎樣管理存取權限?(附:怎樣擷取傳遞過來的參數)
3、有加密方式嗎?https ? 是否有區分不同場合?
4、怎樣解決編碼問題?
5、怎樣控制介面版本迭代問題?
6、上傳檔案怎樣處理?
7、怎樣防止注入?(如果你也沒有用架構)
8、怎樣提升訪問速度?怎樣提高並發?
好,看完問題,讓我們繼續故事!
前編:公司是一個小公司,剛成立不久,技術人員也很少,幾乎是一個人負責一個項目,如web前端,web後端,安卓端、IOS端。很明顯,我的工作是,伺服器端介面的提供!(那裡的我,經驗也是可憐的)
問題1、提供服務方式,之所以會想到用這幾個東西提供服務,是因為,我用的就是PHP開發啊。PHP裡就有這些東西,所以,很自然的嘛,soap,yar這兩個東西在PHP與PHP程式之間的確是不錯的。但是,你要移動端對接,不止安卓,不止IOS。所以,只能國際化了唄!採用restful架構,其實說白了,也就是一個地址,就可以進行操作了,放心吧,大家都是這麼乾的,准沒錯!(附:請考慮提供介面倒底有沒有必要去使用一個完整的MVC架構)
問題2、存取權限,為什麼會有這個問題呢?如果是自己的網站,那麼,你所訪問的地址,就是你自己提供的,根本不需要什麼存取權限控制!但是,如果對外提供服務,那就得考慮了。來訪的人不是內部的怎麼辦?他登入了沒有?現在有多少人在訪問這個服務?這些東西,都應該被一目瞭然的呈現出來。那麼,怎樣控制來訪人員呢?方法1、在程式裡寫死幾個密碼一類的東西,讓用戶端訪問時,帶上此變數以驗證;方法2、為每個用戶端(我說的是安卓或ios等一套原始碼)提供一個appId,appKey,訪問時攜帶,實際上,很多大公司都是這麼乾的;方法3、使用Oauth等授權方式。很明顯,方法2是最好的方式,有了個這個東西,你也可以很方便的進行訪問的有效記錄!(實踐:建立許可權表,建立訪問日誌表,如有必要,建立模組存取權限表,錯誤描述表)
問題3、加密,一般提供介面我們都可以採用json方式(方便啊),那就是說,所有的訪問,幾乎都是採用明碼傳輸,那麼就必須有一定的假設資訊被截獲的防範措施(實際上,這個假設也很容易成立)!對於一般的資訊,加一個普通的普通的簽名即可,如:appId+appKey+訪問參數+timestamp+隨機字元n個 再 md5 得到簽名,伺服器端首先進行該簽名驗證,確認後,再進行後續操作!當然,對於支付一類的操作,這樣的操作還是顯得不夠安全的,那就需要特殊對待,藉助於https的加密,就安全多了!
問題4、編碼問題,也許許多人看來,這並不是問題。但是我想說的是,PHP寫代碼真的很方便很隨意,md5,json_encode等都語言內建的函數,但是對於java和swift可能就沒那麼簡單了,還得自己去找別人封裝的東西,有時稍有不對就可能導致簽名不對,所有訪問都無效!(這裡主要說的是包含中文的地方);我們當時大家採用的都是UTF8的編輯器開發,所以並沒有什麼太大問題!
問題5、版本迭代,這是個問題!因為,如果整個網站都是你的,你想怎麼改都可以,反正別人訪問也就只有你網址這一個入口。但是移動App不一樣了,每個人都是獨立的,他們各自的版本都是不一樣的。如果共用一套介面的話,小的改動還好,向後相容就行了,但是對於一些大方向的改動,這將是致命的,要麼強行使使用者不能使用以促使其更新,要麼你繼續寫一長往篇無用的不可維護的冗餘代碼!所以,做好版本控制是必須的,主要實現為:傳入一個version參數,從而調用不同的內部介面地址,當然,你可以直接介面地址指向另一目錄!這樣,就有很多個版本介面共存了!如 /pro/api/v1.0/xxx, /pro/api/v2.0/xxx
問題6、上傳檔案,這也是問題,因為,其他地方都是採用的常值內容傳遞至伺服器,可以直接進行資料庫儲存操作,但是,對於上傳檔案則不一樣。如果是網站,則一般只能使用Form表單進行提交,而且必須設定屬性multipart/form-data,聲明為檔案類型。那也就是說,不能以普通的json格式提交了!解決方案有2個,方式1、先將檔案以表單形式提交至伺服器,伺服器返回地址,再將地址組合進其他選項中,一起以json提交!方式2、整個內容以webForm表單形式提交,此類頁面單獨處理許可權問題,並注意是否是偽造請求,可另加頁面隱藏token驗證!
問題7、防止注入,也許作為開發人員,說這個已經太low,但是我還是忍不住提了,因為,真的很重要,其實,介面要做的事情很簡單,接受資料,儲存資料,返回狀態。所以,真心覺得,沒必要去用一些很成熟的大型架構,太臃腫!那麼注入問題,就只有你自己解決了。php 使用 mysql_real_escape_string 及 htnlspecialchar進行過濾,基本也就夠了!
問題8、介面的訪問速度,這個是很重要的。你有沒有看到哪個App訪問速度很慢,大家還願意用他的?做到秒開才是王道,由於各種驗證,各種日誌記錄,已經消耗了不少時間,所以更要注意效率問題。索引、緩衝、負載平衡、分布式,用起來。。。 哈哈,太寬泛了
從最初什麼都沒有,到最後,一整套介面的完成,大概花了一個多月時間,感覺還是有很多不OK的地方,再後來準備做訊息推送,做長串連,結果由於某些原因,項目被中斷,也就不了了之了。
寫一點當時的過程,就當是一點點的收穫吧。還記得,當初開始做的時候,參考資料實在太少,以至於做很多東西,都沒有信心,只要憑感覺!!希望這篇文章能幫到部分處於這個時期的人!
歡迎批評,歡迎指正,歡迎提問!