每次升級接口版本時,後端、前端、客戶端都是痛苦的:前端
後端:要兼容舊版客戶端,之前的接口不能動啊,又得寫新接口、新文檔了,唉!git
前端:還好,就是版本號處處都是,改起來比較煩。github
Android:快點啊產品催需求呢,服務器別停過久。對了你知道編譯一次要多久麼?淚奔。。。json
前端:對對,別停過久。還有文檔別再寫錯了啊,上次你複製粘貼的 v3 害我接口調了半天,原來是 v4 。。。後端
iOS:我也被坑了。。。api
後端:呃,我儘快,寫文檔會注意的哈。服務器
後端:另外舊域名 http://api.aaa.com/v4 也會一直開着,保證不會像上次那樣讓3.0客戶端請求掛的。框架
後端:@前端 對了,大家用一個全局的 BASE_URL 存起來,之後改一個地方就行了。ide
Android:咱們就是這麼幹的嘿嘿!函數
iOS:咱們也是,仍是我封裝的。
iOS:但問題是每每多個接口版本並存,仍是要寫好幾個BASE_URL,咱們這是從BASE_URL_V2到BASE_URL_V4。
Android:唉,這個就沒辦法了。
前端:咱們如今也是這麼作的,但以前的那傢伙沒封裝啊,寫獲得處都是。。。
後端:周哥,升級接口版本好煩啊,你有什麼好的辦法嗎?
周哥:具體說下你的問題。
後端:每次都要寫新的接口和文檔,服務器也要重啓,前端和客戶端老是抱怨改域名和文檔錯誤。
項目很趕,文檔是複製粘貼的,老是會落下某些地方沒改。 可是不復制粘貼吧,你看看這格式,從新寫實在是太麻煩了!
周哥:哈哈,之前咱們也老是碰到這種問題,如今解決了。試試這個
周哥:https://github.com/TommyLemon/APIJSON
後端:哇,竟然還有這麼厲害的後端框架啊!我只用過SSH。
周哥:我也是上個月才知道的,朋友推薦的,我試了一週,很是好用,也沒啥大的問題,就整到項目中了。
周哥:SSH過重了,老項目中APIJSON主要用來實現新接口,新項目就只用APIJSON了。
後端:能夠的。不過它怎麼解決版本問題呢?文檔裏沒說啊。
周哥:寫在最下面了。 http://apijson.org/
後端:可在最外層傳版本version來指定使用的版本,不傳或 version <= 0 則使用最新版。 ??
周哥:描述確實比較簡單,我就問了下做者,他是這麼說的:
TommyLemon:
能夠在請求時傳入一個version來指定使用的接口版本號,例如查詢用戶隱私信息:
URL: http://apijson.cn:8080/gets
表單:
{ "Privacy": { "id": 82001, "_password": "123456" }, "tag": "Privacy", "version": 1 }
並且只須要登陸時傳一個全局默認version,以後全部須要登陸的接口(通常佔絕大部分)就都默認用這個了。
{ "type": 0, "phone": "13000082001", "password": "123456", "version": 1 }
因此查詢用戶隱私信息就能夠省略version了:
{ "Privacy": { "id": 82001, "_password": "123456" }, "tag": "Privacy" }
由於上面傳的version和全局默認version同樣,因此服務器返回的結果都同樣:
{ "Privacy": { "id": 82001, "certified": 1, "phone": 13000082001, "balance": 8067 }, "code": 200, "msg": "success" }
固然若是某個請求須要用到和全局默認version不同的接口,也能夠指定當前的version:
{ "Privacy": { "id": 82001, "_password": "123456" }, "tag": "Privacy", "version": 2 }
因爲第2版接口改了校驗配置,因此返回結果就不同了:
{ "Privacy": { "id": 82001, "_password": "123456" }, "code": 406, "msg": "Privacy不容許傳 _password 等[_password, _payPassword]內的任何字段!" }
注:這個接口須要登陸權限,請先點擊右上角登陸後再請求。
周哥:我照着這個來,在測試網頁一個個試了,確實是這樣的。
後端:但還有個問題,項目中可能多個版本並存,它是否是也要同時維護多個版本啊?
周哥:哈哈,之前只有兩種作法:
1.前端根據的需求調對應版本的api,後端只新增對應新需求的api。 2.前端只用一個版本,後端對新版不須要改的api v2也提供一個對應新版的api v3,而後和v2同樣處理,能夠提取v2的代碼爲一個公共的函數。 或者就乾脆重定向到v2,這個操做簡單些,但要損失一些性能。
周哥:用APIJSON就只須要把原來舊版的api改下版本號version爲一個統一的最新版,請求中傳的version若是不存在,則會自動轉到比它高的最接近版本。
後端:也就是我把v1,v2都改爲v3,而後前端傳v1或v2過來,它就轉到v3了?若是不改的話仍是轉到v2?
周哥:對的。若是不傳version或version<=0,就會強制用最新版。這個在修復某些api漏洞時頗有用,把前端請求中的version去掉或者改爲0,就能夠了。
後端:我以爲能夠直接把api的version改爲最新版,這樣更簡單。
周哥:確實,小夥子你很聰明啊。
後端:哈哈,謝謝周哥,我去試試。
後端:做者很牛啊
周哥:哈哈,我以前也好奇什麼人能寫出這樣的框架。
周哥:接口都不用寫了,都是框架自動實現的,話說如今終於沒人再催接口了哈哈!
後端:真的很好用啊,之後就讓前端客戶端都在登陸時傳一個version就搞定了。
後端:不過項目中還有些不須要登陸就能訪問的接口,例如註冊、找回密碼等,這些就只能每次都傳一個version了。
周哥:是的,不過絕大部分接口都是要登陸後才能訪問的啊。
後端:也是啊。
後端:對了,普通的查詢請求好像沒version的示例啊。
周哥:由於不須要哈哈,做者說GET,HEAD請求都是開放請求,沒有版本限制。我試過了確實是這樣。
後端:也就是不用傳version?
周哥:是的,並且請求很是靈活,能夠定製請求的內容、JSON結構,一大堆查詢請求的接口都不用本身寫了。
後端:這樣啊,太棒了,我去Star一下。
後端:你們把新版請求的主域名改爲 http://api.aaa.com,之後登陸時再傳一個version就行了。
{ "version":5 }
前端:這麼快?
iOS:這麼快?
Android:這麼快?
後端:用了新框架嘿嘿!
Android:不用換版本號v5了?
iOS:之後會要加上嗎?
後端:不用了,之後也不用 v6,v7 了,域名不會再改了。
iOS:那不須要登陸的接口呢?
後端:不用管,這幾個接口很穩定,暫時不會動的。
Android:能夠的
iOS:贊
前端:厲害,怎麼作到的啊?
後端:你們看下這個,咱們後端之後的接口都用新框架寫。
後端:https://github.com/TommyLemon/APIJSON
iOS:支持
前端:+1
Android:好棒,我也玩一玩後端嘿嘿!
APIJSON - 自動化接口和文檔
Github源碼及文檔(右上角點Star支持下吧^_^)
https://github.com/TommyLemon/APIJSON
下載客戶端(測試服務器地址:http://apijson.cn:8080)