移動介面API服務/從零到一

來源:互聯網
上載者:User
引語:現在互連網那麼熱,你手裡沒幾個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的地方,再後來準備做訊息推送,做長串連,結果由於某些原因,項目被中斷,也就不了了之了。

寫一點當時的過程,就當是一點點的收穫吧。還記得,當初開始做的時候,參考資料實在太少,以至於做很多東西,都沒有信心,只要憑感覺!!希望這篇文章能幫到部分處於這個時期的人!

歡迎批評,歡迎指正,歡迎提問!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.