小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

前后端對接的思考及總結(jié)

 漢無為 2018-11-23

隨著前端NodeJs技術(shù)的火爆,現(xiàn)在的前端已經(jīng)非以前傳統(tǒng)意義上的前端了,各種前端框架(Vue、React、Angular......)井噴式發(fā)展,配合NodeJs服務端渲染引擎,目前前端能完成的工作不僅僅局限于CSS,JS等方面,很多系統(tǒng)的業(yè)務邏輯都可以放在前端來完成。

目前前端同后端的合作方式是前后端分離,通過Nginx+Tomcat的組合部署(還可加nodejs中間件)方式能有效的進行解耦,并且前后端分離為項目以后的架構(gòu)擴展、微服務化、組件化都打下重要基礎,所以這在以后是一個發(fā)展的必然趨勢,我們需要去適應,做出改變!??!

早期的開發(fā)方式

早期的開發(fā)方式如下圖:

前后端對接的思考及總結(jié)

前后端分離的探索

jsonp

可能由于我在前面三年積累了豐富的前端經(jīng)驗,在上家公司主要負責開發(fā)官網(wǎng)、微信、后臺等相關(guān)系統(tǒng)的接口,前期我們的開發(fā)方式雖然也是前后端分離的方式,但大都使用jsonp跨域接口調(diào)用的方式來達到分離效果,后端所有的接口都是可跨域調(diào)用的jsonp形式,拋開需要登錄的授權(quán)之外的接口,前端在開發(fā)的時候本地無需開啟服務即可調(diào)用服務端接口,然后渲染數(shù)據(jù),完成頁面交互渲染效果

jsonp的優(yōu)點

不像XMLHttpRequest對象實現(xiàn)的Ajax請求那樣受到同源策略的限制

兼容性更好,在更低版本的ie瀏覽器中都能兼容,這里區(qū)別于cors跨域類型

jsonp的原理其實很簡單,當然,這也涉及到前端的知識,簡單點說就是js端的function函數(shù)執(zhí)行

正常的后端響應數(shù)據(jù),例如:

{ 'code':'8200', 'data':{ 'id':'100', 'name':'Test' //more...... }}

jsonp需要的返回格式:

callback({ 'code':'8200', 'data':{ 'id':'100', 'name':'Test' //more...... }});

前端在頁面定義callback回調(diào)函數(shù),callback函數(shù)接收后端響應回來的data-json數(shù)據(jù),后端響應后執(zhí)行callback函數(shù)達到調(diào)用前端業(yè)務邏輯的目的,渲染頁面

nginx+ajax

這種配合開發(fā)方式也是適合前端還沒有引入Node等一站式開發(fā)解決方案的情況下引入的,純粹的HTML+CSS+JS同后端對接,綁定業(yè)務接口,渲染數(shù)據(jù)

我們在使用JSONP開發(fā)的時候,前端都是需要在頁面端寫死HOST+IP接口地址,存在很重大一個弊端就是前端需要些config文件,來配置我們后端的接口請求地址,如果前端工程師規(guī)范意識強一點,會通用到一個配置文件里,但是如果沒有這方面的意識的話,就會出現(xiàn)代碼里硬編碼的情況,不利于服務器遷移,代碼更新,接口變動等操作

為規(guī)避上面碰到的問題,使用nginx的反向代理功能,將后端服務器代理下來,前端在開發(fā)的時候本地開啟nginx服務,即解決了jsonp跨域問題,同時也解決了無需寫死后端的服務ip+端口地址,利于后端在部署時整合代碼,減少不必要的錯誤

node

隨著NodeJs的火熱,前端已經(jīng)可以本地開啟服務寫接口的情況下,就類似服務端開啟tomcat一樣,在這樣的情況下,前端框架VUE、React等都在此基礎上,提供了一套完整的技術(shù)解決方案,這和上面說到的開啟nginx服務架構(gòu)有點類似

這樣做的意義:真正的解放了前后端,專注各自擅長的領域

技術(shù)架構(gòu)如下:

前后端對接的思考及總結(jié)

前端node服務直接訪問后端Java Restful Api接口服務,Api接口最終訪問數(shù)據(jù)庫完成數(shù)據(jù)查詢最終返回node層,node渲染響應數(shù)據(jù)到前端

如果存在會話信息同步等問題,可以使用中間件,例如redis緩存數(shù)據(jù)庫,解決前端node和后端Api信息同步問題,傳參可以通過JWT等方式完成接口權(quán)限驗證

不管是jsonp還是ajax+nginx這兩種方式,node作為中間件都可以輕松切換處理,而且node作為中間層,還可以將多個后端接口組合成一整個數(shù)據(jù)集,最終以同步的方式渲染前端,這也利于做SEO優(yōu)化,也是前面兩種方式無法做到的

關(guān)于前后端分離,詳細可閱讀前后端分離的思考與實踐,該文章詳細的列述了關(guān)于前后端分離的實際經(jīng)驗

談談接口

隨著前后端的分離,后端工程師不需要編寫頁面,不需要寫JS,只需要提供接口即可,可是就是僅僅這一個接口,對于很多后端開發(fā)工程師而言,在實際開發(fā),同前端對接的過程中,依然問題重重

很多后端同學說我只負責寫接口,其他我一概不管,這樣造成的后果就是

1、接口結(jié)構(gòu)無序、雜亂無章

2、接口和實際業(yè)務場景不相匹配、不可用

3、頻繁的同前端溝通,簡單的事情復雜化,前后端都很惱火

4、事情沒做好

后端在編寫接口前,首先是對業(yè)務的理解,在對業(yè)務未理解透徹之前,編碼都是無意義的,作為后端來說,需要鍛煉自己對整個系統(tǒng)全局考慮的能力,接口之間并非是毫無關(guān)聯(lián)的,我們在寫第一個接口之間,其他接口之間的業(yè)務邏輯也許考慮到,這在后端團隊合作開發(fā)不同功能的情況下顯得尤為重要.

后端在開發(fā)接口時,我覺得主要從以下幾個方面需要注意:

接口url 定義

接口類型、參數(shù)

全局錯誤碼定義

接口json格式

接口文檔編寫

接口url定義

對于后端開發(fā)人員來說,接口前端入?yún)?最終組合查詢數(shù)據(jù)庫資源,經(jīng)過一系列相關(guān)業(yè)務場景下的計算,響應給前端json數(shù)據(jù),每一層url的path定義需要清晰明了,這和后端在使用AOP定義事務管理同理,后端service需要滿足一定的命名規(guī)范,這樣方便統(tǒng)一管理,而且有這層規(guī)范后,后續(xù)的前后端對接會輕松很多

為了在許多API和長時間內(nèi)提供一致的開發(fā)人員體驗,API使用的所有名稱應為:

  • 簡單
  • 直覺
  • 一致

這包括接口,資源,集合,方法和消息的名稱。

由于許多開發(fā)人員不是英文母語人士,因此這些命名約定的目標之一是確保大多數(shù)開發(fā)人員能夠輕松了解API。 它通過鼓勵在命名方法和資源時使用簡單,一致和小的詞匯表來實現(xiàn)。

  • API中使用的名稱應該是正確的美國英語。例如,許可證(而不是許可證),顏色(而不是顏色)。
  • 可以簡單地使用常用的簡短形式或長字的縮寫。例如,API優(yōu)于應用程序編程接口。
  • 盡可能使用直觀,熟悉的術(shù)語。例如,當描述刪除(和銷毀)資源時,刪除是優(yōu)先于擦除。
  • 對同一概念使用相同的名稱或術(shù)語,包括跨API共享的概念。
  • 避免名稱重載。為不同的概念使用不同的名稱。
  • 仔細考慮使用可能與常用編程語言中的關(guān)鍵字沖突的名稱??梢允褂眠@些名稱,但在API審查期間可能會觸發(fā)額外的審查。謹慎和謹慎地使用它們。

接口類型、參數(shù)

關(guān)于接口的請求類型,目前比較常用的:GET、POST、PUT、DELETE、PATCH

GET(SELECT):從服務器取出資源(一項或多項)。

POST(CREATE):在服務器新建一個資源。

PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。

PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。

DELETE(DELETE):從服務器刪除資源。

后端可根據(jù)不同的業(yè)務場景定義不同的接口類型

在定義接口參數(shù)之時,目前我們常用的幾種提交方式

表單提交,application/x-www-form-urlencoded

前后端對接的思考及總結(jié)

表單提交主要針對key-value的提交形式

如下Java片段:

@PostMapping('/queryAll')public RestfulMessage queryAll(RuleCheckLogs ruleCheckLogs, @RequestParam(value = 'current_page',defaultValue = '1')Integer current_page , @RequestParam(value = 'page_size',defaultValue = '10')Integer page_size , @RequestParam(value = 'tableName',required = false) String tableName){ RestfulMessage restfulMessage=new RestfulMessage(); try{ assertArgumentNotEmpty(ruleCheckLogs.getProjectId(),'質(zhì)檢方案id不能為空'); restfulMessage.setData(qcRuleCheckLogsService.queryRuleLogsByPage(ruleCheckLogs,tableName,current_page,page_size)); }catch (Exception e){ restfulMessage=wrapperException(e); } return restfulMessage;}

文件流提交

json提交,application/json

前后端對接的思考及總結(jié)

json提交方式在SpringMVC或Spring Boot中主要有兩種,一種是以@RequestBody注解接收方式,另外一種是以HttpEntity requestEntity字節(jié)接收

Java代碼示例:

@PostMapping('/mergeModelEntitys')public RestfulMessage mergeModelEntitys(HttpEntity requestEntity){ RestfulMessage restfulMessage=new RestfulMessage(); try{ JsonObject paramsJson = paramJson(requestEntity); assertJsonNotEmpty(paramsJson,'請求參數(shù)不能為空'); //more... }catch (Exception e){ restfulMessage=wrapperException(e); } return restfulMessage;}

全局錯誤碼定義

錯誤碼的定義同HTTP請求狀態(tài)碼一樣,對接者能通過系統(tǒng)定義的錯誤碼,快速了解接口返回錯誤信息,方便排查錯誤原因

{ 'code': '8200', 'message': 'Success', 'data': { 'total_page': 1, 'current_page': 1, 'page_size': 10, 'count': 5, 'data': [ { 'id': 'a29ab07f1d374c22a72e884d4e822b29', //...... }//.... ] }}

接口json格式

后端響應json給前端需要注意以下幾點:

1、json格式需固定

例如如下圖形

前后端對接的思考及總結(jié)

如上圖所示,橫向是時間,縱向是value值

我們給出的json結(jié)構(gòu)應該如此:

[ { 'date':'2018-01', 'value':100 }, { 'date':'2018-02', 'value':200 } //more...]

在工作中,我們經(jīng)常碰見這樣的數(shù)據(jù)格式:

[ '2018-01':{ value:100 }, '2018-02':{ value:200 } //more...]

這里所說的json格式固定主要針對此種情況,后端給到前端的接口格式必須是固定的,所有動態(tài)數(shù)據(jù)值都需相應的key與之對應

2、所有返回接口數(shù)據(jù)需直接可用,越簡單越好

后端提供給前端的接口數(shù)據(jù),最終交給前端的工作,只需要讓前端渲染數(shù)據(jù)即可,越簡單越好,不因摻雜過多的業(yè)務邏輯讓前端處理,所有復雜的業(yè)務邏輯,能合并規(guī)避掉的都需后端處理掉.

接口文檔編寫

接口文檔編寫是前后端對接重要依據(jù),后端寫明接口文檔,前端根據(jù)接口文檔對接

文檔形勢目前主要分幾種:

1、依賴swagger框架,自動生成接口文檔(swagger只能生成基于key-value詳細參數(shù)方式,針對json格式,無法說明具體請求內(nèi)容)

2、手動編寫說明文檔,推薦markdown編寫

接口對接

萬事俱備,只欠東風,雖然上面我們準備了所有我們該準備的,接口定義完美無缺,接口文檔也已說明,但在對接時任然可能出現(xiàn)問題,此時我想我們還需注意的細節(jié)

1、后端接口需自行進行Junit單元測試

Spring目前集成Junit框架可方便進行單元測試,包括對業(yè)務bean的方法測試,以及針對api的mock測試

@RunWith(SpringRunner.class)@SpringBootTestpublic class QcWebApplicationTests { @Autowired private WebApplicationContext context; private MockMvc mvc; @Autowired QcFieldService qcFieldService; @Before public void setUp() throws Exception { //初始化mock對象 mvc = MockMvcBuilders.webAppContextSetup(context).build(); } @Test public void queryByDsId(){ try { //針對mock-接口Controller層測試 mvc.perform(MockMvcRequestBuilders.post('/qc/entity/queryByDsId') .contentType(MediaType.APPLICATION_JSON_UTF8) .param('dsId', '7d4c101498c742368ef7232f492b95bc') .accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()); } catch (Exception e) { e.printStackTrace(); } } @Test public void testUpdateField(){ QcField qcField=new QcField(); qcField.setId('513ee55f5dc2498cb69b14b558bc73e6'); qcField.setShortName('密碼'); //業(yè)務bean-service方法測試 qcFieldService.updateBatchFields(Lists.newArrayList(qcField)); }

2、使用工具測試,推薦PostMan

作為接口調(diào)試神器,Postman大名想必大家都已知道

作為后端來說,我們需要學會查看chrome推薦給我們的審查元素的功能,可參看Chrome開發(fā)工具介紹

chrome提供了一個可以copy當前接口的url功能,最終生成curl命令行

前后端對接的思考及總結(jié)

最終通過Copy as cURL(bash)功能可生成curl命令

curl 'http:///qc/ds/getAll' -H 'Origin: http://' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: application/json, text/plain, */*' -H 'Referer: http:///index.html' -H 'Connection: keep-alive' --data 'current_page=1&page_size=6&' --compressed

以上命令可以在Linux等各終端直接執(zhí)行

curl命令是一個利用URL規(guī)則在命令行下工作的文件傳輸工具。它支持文件的上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習慣稱curl為下載工具。作為一款強力工具,curl支持包括HTTP、HTTPS、ftp等眾多協(xié)議,還支持POST、cookies、認證、從指定偏移處下載部分文件、用戶代理字符串、限速、文件大小、進度條等特征。做網(wǎng)頁處理流程和數(shù)據(jù)檢索自動化,curl可以祝一臂之力。

postman提供導入curl命令行

前后端對接的思考及總結(jié)

前后端分離,簡化了我們的開發(fā)方式,不同人專注于不同的領域,技術(shù)價值最大化,大大提高工作效率,我們在掌握這些技能的同時,也需要加強自身的發(fā)展,以適應當前的技術(shù)發(fā)展趨勢,不管是前端還是后端,多了解一些。

這些技術(shù)如何學習,有沒有免費資料?

對前端的技術(shù),架構(gòu)技術(shù)感興趣的同學關(guān)注我的頭條號,并在后臺私信發(fā)送關(guān)鍵字:“前端”即可獲取免費的架構(gòu)師學習資料

知識體系已整理好,歡迎免費領取。還有面試視頻分享可以免費獲取。關(guān)注我,可以獲得沒有的架構(gòu)經(jīng)驗哦!!

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多