後端自動化版本管理,不再用改URL了!

每次升級接口版本時,後端、前端、客戶端都是痛苦的:前端

後端:要兼容舊版客戶端,之前的接口不能動啊,又得寫新接口、新文檔了,唉!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]內的任何字段!"
}

注:這個接口須要登陸權限,請先點擊右上角登陸後再請求。

APIJSON在線測試

 

 

周哥:我照着這個來,在測試網頁一個個試了,確實是這樣的。

後端:但還有個問題,項目中可能多個版本並存,它是否是也要同時維護多個版本啊?

周哥:哈哈,之前只有兩種作法:

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一下。

 

 

後端:@前端 @Android @iOS 新版接口寫好了。

後端:你們把新版請求的主域名改爲 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

APIJSONClientApp.apk

相關文章
相關標籤/搜索