引語:現在互聯網那么熱,你手里沒幾個APP都不好意思跟別人打招呼!但是,難道APP就是全能的神嗎?答案是否定的,除了優雅的APP前端展示,其實核心還是服務器端。數據的保存、查詢、消息的推送,無不是在服務器端完成的,默默地!那么,怎樣提供一個好的服務端API接口就是一個至關重要的問題了!
也許你會說,現在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 及 htmlspecialchar進行過濾,基本也就夠了!
問題8、接口的訪問速度,這個是很重要的。你有沒有看到哪個APP訪問速度很慢,大家還願意用他的?做到秒開才是王道,由於各種驗證,各種日志記錄,已經消耗了不少時間,所以更要注意效率問題。索引、緩存、負載均衡、分布式,用起來。。。 哈哈,太寬泛了
從最初什么都沒有,到最后,一整套接口的完成,大概花了一個多月時間,感覺還是有很多不OK的地方,再后來准備做消息推送,做長連接,結果由於某些原因,項目被中斷,也就不了了之了。
寫一點當時的過程,就當是一點點的收獲吧。還記得,當初開始做的時候,參考資料實在太少,以至於做很多東西,都沒有信心,只是憑感覺!!希望這篇文章能幫到部分處於這個時期的人!
其實不管是做什么樣的開發,都應該是從核心要解決的問題出發的,當你把問題都解決了之后,也許,一個好的設計好的架構就已經悄然呈現!這也許就是解決問題之美吧!
歡迎批評,歡迎指正,歡迎提問!