1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        聊聊前后端分離接口規(guī)范

        共 8268字,需瀏覽 17分鐘

         ·

        2021-08-01 16:25

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

        1. 前言

        隨著互聯(lián)網(wǎng)的高速發(fā)展,前端頁(yè)面的展示、交互體驗(yàn)越來(lái)越靈活、炫麗,響應(yīng)體驗(yàn)也要求越來(lái)越高,后端服務(wù)的高并發(fā)、高可用、高性能、高擴(kuò)展等特性的要求也愈加苛刻,從而導(dǎo)致前后端研發(fā)各自專注于自己擅長(zhǎng)的領(lǐng)域深耕細(xì)作。

        然而帶來(lái)的另一個(gè)問(wèn)題:前后端的對(duì)接界面雙方卻關(guān)注甚少,沒(méi)有任何接口約定規(guī)范情況下各自擼起袖子就是干,導(dǎo)致我們?cè)诋a(chǎn)品項(xiàng)目開(kāi)發(fā)過(guò)程中,前后端的接口聯(lián)調(diào)對(duì)接
        工作量占比在30%-50%左右,甚至?xí)摺M昂蠖私涌诼?lián)調(diào)對(duì)接及系統(tǒng)間的聯(lián)調(diào)對(duì)接都是整個(gè)產(chǎn)品項(xiàng)目研發(fā)的軟肋。

        本文的主要初衷就是規(guī)范約定先行,盡量避免溝通聯(lián)調(diào)產(chǎn)生的不必要的問(wèn)題,讓大家身心愉快地專注于各自擅長(zhǎng)的領(lǐng)域。

        2. 為何要分離

        參考兩篇文章《Web 研發(fā)模式的演變》、《Web應(yīng)用的組件化開(kāi)發(fā)》, 目前現(xiàn)有前后端開(kāi)發(fā)模式:“后端為主的MVC時(shí)代”,如下圖所示:

        后端為主的MVC時(shí)代

        代碼可維護(hù)性得到明顯好轉(zhuǎn),MVC 是個(gè)非常好的協(xié)作模式,從架構(gòu)層面讓開(kāi)發(fā)者懂得什么代碼應(yīng)該寫在什么地方。為了讓 View 層更簡(jiǎn)單干脆,還可以選擇 Velocity、Freemaker 等模板,使得模板里寫不了 Java 代碼??雌饋?lái)是功能變?nèi)趿?,但正是這種限制使得前后端分工更清晰。然而依舊并不是那么清晰,這個(gè)階段的典型問(wèn)題是:

        1. 前端開(kāi)發(fā)重度依賴開(kāi)發(fā)環(huán)境,開(kāi)發(fā)效率低。這種架構(gòu)下,前后端協(xié)作有兩種模式:一種是前端寫demo,寫好后,讓后端去套模板 。淘寶早期包括現(xiàn)在依舊有大量業(yè)務(wù)線是這種模式。好處很明顯,demo 可以本地開(kāi)發(fā),很高效。不足是還需要后端套模板,有可能套錯(cuò),套完后還需要前端確定,來(lái)回溝通調(diào)整的成本比較大。另一種協(xié)作模式是前端負(fù)責(zé)瀏覽器端的所有開(kāi)發(fā)和服務(wù)器端的 View 層模板開(kāi)發(fā),支付寶是這種模式。 好處是 UI 相關(guān)的代碼都是前端去寫就好,后端不用太關(guān)注,不足就是前端開(kāi)發(fā)重度綁定后端環(huán)境,環(huán)境成為影響前端開(kāi)發(fā)效率的重要因素。

        2. 前后端職責(zé)依舊糾纏不清。Velocity 模板還是蠻強(qiáng)大的,變量、邏輯、宏等特性,依舊可以通過(guò)拿到的上下文變量來(lái)實(shí)現(xiàn)各種業(yè)務(wù)邏輯。這樣,只要前端弱勢(shì)一點(diǎn),往往就會(huì)被后端要求在模板層寫出不少業(yè)務(wù)代碼。還有一個(gè)很大的灰色地帶是 Controller,頁(yè)面路由等功能本應(yīng)該是前端最關(guān)注的,但卻是由后端來(lái)實(shí)現(xiàn)。Controller 本身與 Model 往往也會(huì)糾纏不清,看了讓人咬牙的業(yè)務(wù)代碼經(jīng)常會(huì)出現(xiàn)在 Controller 層。這些問(wèn)題不能全歸結(jié)于程序員的素養(yǎng),否則 JSP 就夠了。

        3. 對(duì)前端發(fā)揮的局限。性能優(yōu)化如果只在前端做空間非常有限,于是我們經(jīng)常需要后端合作才能碰撞出火花,但由于后端框架限制,我們很難使用Comet、Bigpipe等技術(shù)方案來(lái)優(yōu)化性能。

        總上所述,就跟為什麼要代碼重構(gòu)一樣:

        1. 關(guān)注點(diǎn)分離

        2. 職責(zé)分離

        3. 對(duì)的人做對(duì)的事

        4. 更好的共建模式

        5. 快速的反應(yīng)變化

        3. 什么是分離

        我們現(xiàn)在要做的前后分離第一階段:“基于 Ajax 帶來(lái)的 SPA 時(shí)代”,如圖:

        基于 Ajax 帶來(lái)的 SPA 時(shí)代

        這種模式下,前后端的分工非常清晰,前后端的關(guān)鍵協(xié)作點(diǎn)是 Ajax 接口。 看起來(lái)是如此美妙,但回過(guò)頭來(lái)看看的話,這與 JSP 時(shí)代區(qū)別不大。復(fù)雜度從服務(wù)端的 JSP 里移到了瀏覽器的 JavaScript,瀏覽器端變得很復(fù)雜。類似 Spring MVC,這個(gè)時(shí)代開(kāi)始出現(xiàn)瀏覽器端的分層架構(gòu):

        瀏覽器端的分層架構(gòu)

        對(duì)于這一SPA階段,前后端分離有幾個(gè)重要挑戰(zhàn):

        1. 前后端接口的約定。 如果后端的接口一塌糊涂,如果后端的業(yè)務(wù)模型不夠穩(wěn)定,那么前端開(kāi)發(fā)會(huì)很痛苦。這一塊在業(yè)界有 API Blueprint 等方案來(lái)約定和沉淀接口,==在阿里,不少團(tuán)隊(duì)也有類似嘗試,通過(guò)接口規(guī)則、接口平臺(tái)等方式來(lái)做。有了和后端一起沉淀的接口規(guī)則,還可以用來(lái)模擬數(shù)據(jù),使得前后端可以在約定接口后實(shí)現(xiàn)高效并行開(kāi)發(fā)。== 相信這一塊會(huì)越做越好。

        2. 前端開(kāi)發(fā)的復(fù)雜度控制。 SPA 應(yīng)用大多以功能交互型為主,JavaScript 代碼過(guò)十萬(wàn)行很正常。大量 JS 代碼的組織,與 View 層的綁定等,都不是容易的事情。典型的解決方案是業(yè)界的 Backbone,但 Backbone 做的事還很有限,依舊存在大量空白區(qū)域需要挑戰(zhàn)。

        4. 如何做分離

        4.1 職責(zé)分離

        職責(zé)分離

        1. 前后端僅僅通過(guò)異步接口(AJAX/JSONP)來(lái)編程

        2. 前后端都各自有自己的開(kāi)發(fā)流程,構(gòu)建工具,測(cè)試集合

        3. 關(guān)注點(diǎn)分離,前后端變得相對(duì)獨(dú)立并松耦合

        后端前端
        提供數(shù)據(jù)接收數(shù)據(jù),返回?cái)?shù)據(jù)
        處理業(yè)務(wù)邏輯處理渲染邏輯
        Server-side MVC架構(gòu)Client-side MV* 架構(gòu)
        代碼跑在服務(wù)器上代碼跑在瀏覽器上

        4.2 開(kāi)發(fā)流程

        1. 后端編寫和維護(hù)接口文檔,在 API 變化時(shí)更新接口文檔

        2. 后端根據(jù)接口文檔進(jìn)行接口開(kāi)發(fā)

        3. 前端根據(jù)接口文檔進(jìn)行開(kāi)發(fā) + Mock平臺(tái)

        4. 開(kāi)發(fā)完成后聯(lián)調(diào)和提交測(cè)試

        Mock 服務(wù)器根據(jù)接口文檔自動(dòng)生成 Mock 數(shù)據(jù),實(shí)現(xiàn)了接口文檔即API:

        開(kāi)發(fā)流程

        4.3 具體實(shí)施

        現(xiàn)在已基本完成了,接口方面的實(shí)施:

        1. 接口文檔服務(wù)器:可實(shí)現(xiàn)接口變更實(shí)時(shí)同步給前端展示;

        2. Mock接口數(shù)據(jù)平臺(tái):可實(shí)現(xiàn)接口變更實(shí)時(shí)Mock數(shù)據(jù)給前端使用;

        3. 接口規(guī)范定義:很重要,接口定義的好壞直接影響到前端的工作量和實(shí)現(xiàn)邏輯;具體定義規(guī)范見(jiàn)下節(jié);

        接口文檔+Mock平臺(tái)服務(wù)器

        5. 接口規(guī)范V1.0.0

        5.1 規(guī)范原則

        1. 接口返回?cái)?shù)據(jù)即顯示:前端僅做渲染邏輯處理;

        2. 渲染邏輯禁止跨多個(gè)接口調(diào)用;

        3. 前端關(guān)注交互、渲染邏輯,盡量避免業(yè)務(wù)邏輯處理的出現(xiàn);

        4. 請(qǐng)求響應(yīng)傳輸數(shù)據(jù)格式:JSON,JSON數(shù)據(jù)盡量簡(jiǎn)單輕量,避免多級(jí)JSON的出現(xiàn);

        5.2 基本格式

        5.2.1 請(qǐng)求基本格式

        GET請(qǐng)求、POST請(qǐng)求==必須包含key為body的入?yún)?,所有?qǐng)求數(shù)據(jù)包裝為JSON格式,并存放到入?yún)ody中==,示例如下:

        1. GET請(qǐng)求:

        xxx/login?body={"username":"admin","password":"123456","captcha":"scfd","rememberMe":1}

        1. POST請(qǐng)求:

          POST請(qǐng)求

        5.2.2 響應(yīng)基本格式

        {
            code: 200,
            data: {
                message: "success"
            }
        }


        1. code : 請(qǐng)求處理狀態(tài)

        200: 請(qǐng)求處理成功

        500: 請(qǐng)求處理失敗

        401: 請(qǐng)求未認(rèn)證,跳轉(zhuǎn)登錄頁(yè)

        406: 請(qǐng)求未授權(quán),跳轉(zhuǎn)未授權(quán)提示頁(yè)

        1. data.message: 請(qǐng)求處理消息

        code=200 且 data.message="success": 請(qǐng)求處理成功

        code=200 且 data.message!="success": 請(qǐng)求處理成功, 普通消息提示:message內(nèi)容

        code=500: 請(qǐng)求處理失敗,警告消息提示:message內(nèi)容

        5.3 響應(yīng)實(shí)體格式

        {
            code: 200,
            data: {
                message: "success",
                entity: {
                    id: 1,
                    name: "XXX",
                    code: "XXX"
                }
            }
        }


        data.entity: 響應(yīng)返回的實(shí)體數(shù)據(jù)

        5.4 響應(yīng)列表格式

        {
            code: 200,
            data: {
                message: "success",
                list: [
                    {
                        id: 1,
                        name: "XXX",
                        code: "XXX"
                    },
                    {
                        id: 2,
                        name: "XXX",
                        code: "XXX"
                    }
                ]
            }
        }


        data.list: 響應(yīng)返回的列表數(shù)據(jù)

        5.5 響應(yīng)分頁(yè)格式

        {
            code: 200,
            data: {
                recordCount: 2,
                message: "success",
                totalCount: 2,
                pageNo: 1,
                pageSize: 10,
                list: [
                    {
                        id: 1,
                        name: "XXX",
                        code: "H001"
                    },
                    {
                        id: 2,
                        name: "XXX",
                        code: "H001"
                    } ],
                totalPage: 1
            }
        }


        data.recordCount: 當(dāng)前頁(yè)記錄數(shù)
        data.totalCount: 總記錄數(shù)
        data.pageNo: 當(dāng)前頁(yè)碼
        data.pageSize: 每頁(yè)大小
        data.totalPage: 總頁(yè)數(shù)

        5.6 特殊內(nèi)容規(guī)范

        5.6.1 下拉框、復(fù)選框、單選框

        由后端接口統(tǒng)一邏輯判定是否選中,通過(guò)isSelect標(biāo)示是否選中,示例如下:

        {
            code: 200,
            data: {
                message: "success",
                list: [{
                    id: 1,
                    name: "XXX",
                    code: "XXX",
                    isSelect: 1
                }, {
                    id: 1,
                    name: "XXX",
                    code: "XXX",
                    isSelect: 0
                }]
            }
        }


        禁止下拉框、復(fù)選框、單選框判定選中邏輯由前端來(lái)處理,統(tǒng)一由后端邏輯判定選中返回給前端展示;

        5.6.2 Boolean類型

        關(guān)于Boolean類型,JSON數(shù)據(jù)傳輸中一律使用1/0來(lái)標(biāo)示,1為是/True,0為否/False;

        5.6.3 日期類型

        關(guān)于日期類型,JSON數(shù)據(jù)傳輸中一律使用字符串,具體日期格式因業(yè)務(wù)而定;

        6. 未來(lái)的大前端

        目前我們現(xiàn)在用的前后端分離模式屬于第一階段,由于使用到的一些技術(shù)jquery等,對(duì)于一些頁(yè)面展示、數(shù)據(jù)渲染還是比較復(fù)雜,不能夠很好的達(dá)到復(fù)用。對(duì)于前端還是有很大的工作量。

        下一階段可以在前端工程化方面,對(duì)技術(shù)框架的選擇、前端模塊化重用方面,可多做考量。也就是要迎來(lái)“==前端為主的 MV* 時(shí)代==”。大多數(shù)的公司也基本都處于這個(gè)分離階段。

        最后階段就是==Node 帶來(lái)的全棧時(shí)代==,完全有前端來(lái)控制頁(yè)面,URL,Controller,路由等,后端的應(yīng)用就逐步弱化為真正的數(shù)據(jù)服務(wù)+業(yè)務(wù)服務(wù),做且僅能做的是提供數(shù)據(jù)、處理業(yè)務(wù)邏輯,關(guān)注高可用、高并發(fā)等。


          作者 |  七寸知架構(gòu)

        來(lái)源 |  jianshu.com/p/c81008b68350

        瀏覽 63
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            av超碰在线| 伊人无码视频| 日韩精品91| 99er在线视频| 12—13女人毛片毛片| 男女福利视频| 成人精品亚洲人成在线| av福利在线观看| 91熟女丰满原味| 亚洲另类视频| 在线视频第一页| 精品少妇人妻| 久久一二三区| 黄色特级毛片| 999国产视频| 久操av在线| 抽插影院| 另类TS人妖一区二区三区| 日本天堂网在线观看| 黄网91| 国产免费观看av| 国产亚洲视频完整在线观看 | 日韩欧美中文字幕公布| 俺也要操| 亚洲综合一区二区三区| 精品人人人| 777国产盗摄偷窥精品0000| 五月天亭亭.com| 国产欧美综合在线三区| 成人黄色电影| 五月AV| 女人的天堂AV| 一级女婬片A片AAAA片| 狠狠躁日日躁夜夜躁A片无码| 国产一区二区三区视频在线观看| 一级一A片一a免费看| 亚洲午夜精品久久久| 国产成人AV免费无码| 免费看黄色视频的网站| 日韩黄色小电影| 国产精品九九九九九九| 国产一区二区在线播放| 高清无码直接看| 狠狠se| 四虎午夜福利| 婷婷丁香五月花| 欧美在线看片| 亚洲aaa在线| 欧美成人一区二区三区片| 日韩AV无码免费| 亚洲永久在线| 特黄特色免费大片| 久久毛久久久j| 中文字幕在线观看福利视频| 久久午夜无码鲁丝片午夜精品| 欧美一级二级三级| 麻豆三级电影| 久草中文在线| 国产无码内射| 国产精品大香蕉| caoporen| 亚洲欧美综合| 99热在线观看| 手机不卡黄色视频在线| 欧美日逼| 热热毛片| 欧美国产日韩欧美亚洲国产| 无码av无码AV| 人妻无码一二三区免费| 欧美五月在线网址| 伊人久久狼人| 久久欧洲成人精品无码区| 奶头和荫蒂添的好舒服囗交漫画| 黄色色情小说| 中文字幕黑人无码| 国产美女操逼网站| 91探花精品偷拍在线播放| 日韩主播在线| 久久青草影院| 91视频在线免费观看app| 91三级片在线播放| 精品秘一区性综合三区| 中文一区在线观看| 一级片AV| 无码电影在线播放| 国产深喉视频| 免费操逼电影| 狠狠躁日日躁夜夜躁A片小说免费 色综合久久久无码中文字幕999 | 欧美午夜精品久久久久免费视| 一区二区三区高清不卡| 国产无遮挡又黄又爽又色视频软件 | 青青热视频| 丝袜二区| 亚洲成人A| 欧美+日韩+国产+成人+在线| 成人精品一区二区无码| 美女久久久久| 自拍亚洲欧美| 日皮视频在线免费观看| 亚洲小视频在线播放| 91AV免费观看| 高清无码波多野结衣| 靠逼免费视频| 97碰碰碰| 日韩在线中文| 欧美日韩一区二区三区| 韩国AV三级| 亚洲无码操逼视频| 中文字幕免费中文| 成人高清在线| 一本一道波多野结衣潮喷视频| www伊人| 无码免费毛片一区二区三区古代| 九九九九国产| 五月天激情综合网| 女生自慰网站在线观看| 高h视频在线观看| 69AV在线| 夫妻成人免费看片一区二区| 天天澡日日久| 欧美亚洲成人在线| 91中文字幕在线观看| 青草青视频| 免费无码婬片A片AAA毛片96| 亚洲成人中文字幕| 东北成人毛片| A免费观看| AV老鸭窝| 国产一级片免费| 日韩在线视频免费播放| 99ri国产| 九九热免费视频| 天堂网在线视频| 高清无码一区| 人妻精品电影| 亚洲日日夜夜| 日屄电影| 精品无码人妻一区二区三区| 99热在线观看免费| 国产精品午夜成人免费| 国产久久这里只有精品视频| 大香蕉一区二区| 最新国产第一页| 熟女视频一区二区| 人妻少妇偷人精品久久| 熟妇槡BBBB槡BBBB图| 欧美做受高潮白| 天天爽天天爽夜夜爽毛片| 精品欧美视频| 亚洲黄色在线视频| av女人天堂| 天堂精品在线| 四色五月婷婷| 国产一区二区不卡亚洲涩情| 色色综合视频| 精品成人A片久久久久久不卡三区| 日韩精品久久久久久久| 南京搡BBBB搡BBBB| 黄色带亚州| 亚洲福利网| 黄色片在线免费观看| 欧美第一色| 欧美婷婷| 奇米影视狠狠干| 亚洲人成免费网站| www.久久久久| www.久久精品视频| 亚洲成人无码在线| 在线国产91| 综合久久av| 麻豆精品久久久久久久99蜜桃| 中文字幕视频免费| 高清无码不卡AV| 69视频网站| 一区二区三区四区五区无码 | 黄色片成人| 色交视频| 一本道视频在线| 在线播放毛片| 五月婷婷影院| 日韩亚洲欧美在线| 91色五月| 波多野结衣成人视频| 京熱大亂交无碼大亂交| 91青青视频| 亚洲中文字| 免费无码一级A片大黄在线观看 | 日韩欧美高清第一期| 色丁香在线| 男人的天堂在线视频| 182在线视频| 十八禁网站在线| 午夜福利大片| 日韩av小电影| 97人人操人人干| 精品小视频| 欧美操BB| 亚洲欧美中文字幕| 日本黄色三级| 欧美精品一区二区少妇免费A片| 精品国产乱码久久久久久郑州公司 | 这里视频很精彩免费观看电视剧最新| 黄色大片免费网站| 操操操网| 妻子互换被高潮了三次| 爱干视频| 国产AV大香蕉| 91精品丝袜久久久久久| 性爱av天堂| 日韩欧美成人电影| 91大神在线免费看| 无码综合| 99久久久精品| 天天操综合| 日本少妇午夜福利| 日日爱网| 中文字幕有码在线看| 亚洲无码AV一区二区三区| 大香蕉97| 免费毛片观看| 农村三级片| 免费a视频在线观看| www.日韩| 欧美日韩V| 国产三级网址| 国产色无码网站www色视频| 就要操| 特黄视频在线观看| 免费69视频看片| 91成人小电影| 亚洲免费网站| 日韩AV免费在线播放| 91超碰免费在线| 欧美福利| 制服丝袜无码| a片在线免费播放| 91成人无码视频| 青青草国产| 国产成人午夜福利视频| 国产Av影视| 欧美理论片在线观看| 中文字幕免费视频在线播放| 欧美中文网| 午夜福利1000| JUY-579被丈夫的上司侵犯后的第7天,我| 18+免费网站| 国产精品天天| 黄色小视频免费观看| 日本高清色清di免费观看| av在线无码观看| 黄色无码电影| 99热这里只有精品9| 熟妇高潮一区二区高潮| 日本一本在线| 黄色特级片| 91精品国产成人www| 欧美视频h| 国内老熟妇对白HDXXXX| 91干穴穴在线观看| 中文字幕日韩有码| 国产日韩欧美一区二区| 一区二区视频免费| 我要看黄色一级片| 国产精品蜜| 日本不卡一区| 成人免费无码激情AV片| 十八禁视频在线观看网站.www | 日韩中文字| 国产视频高清无码| 丰满人妻一区二区三区蜜桃视频| 成人做爰免费网站2023| 日韩成人免费在线| 免费av在线播放| 精品一区国产探花| 一区无码高清| www.日韩欧美| av福利电影在线| 香蕉视频日韩| 操婷婷| 天堂精品在线| 超碰人| 人人妻人人爽人人精品| 亚洲无码黄色电影| 色吧久久| 爱搞搞就搞搞| 一区二区三区三级片| 欧美成人在线免费视频| 日本三级在线| 中文字幕资源在线| 九九精品视频在线播放| 国产无码专区| 国产69AV| 久久久久久久久免费看无码| 97无码免费| 国产人妖AV| 久久99热这里只频精品6学生| 久久久久久99| 操屄视频网站| 婷婷丁香六月| 欧美69成人|