◆何 軍 陳貴民 黃惠海 鄭漢軍 陳思德
關(guān)于RESTful架構(gòu)的設(shè)計(jì)
◆何 軍 陳貴民 黃惠海 鄭漢軍 陳思德
(廈門安勝網(wǎng)絡(luò)科技有限公司 福建 321008)
REST完整表示的意思是形態(tài)的轉(zhuǎn)移,在滿足形態(tài)架構(gòu)的基礎(chǔ)上,在以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件設(shè)計(jì)的架構(gòu)上,得到一個(gè)功能完善、性能穩(wěn)定、適合于通信的結(jié)構(gòu)。如果一個(gè)平臺(tái)結(jié)構(gòu)符合REST的原則和約束規(guī)范,則說明這是RESTful架構(gòu)。
資源;URL;鏈接;版本號(hào)
軟件的版本一般都是存在兼容性的,同時(shí)軟件也是不斷地維護(hù)和更新,所以軟件在后續(xù)的使用過程中,往往會(huì)存在多個(gè)版本,然而軟件的版本需要兼容性,這樣軟件在新的版本更新時(shí),可以兼容舊的版本,而且對(duì)于使用者而言,對(duì)于舊功能的請(qǐng)求路徑,不會(huì)產(chǎn)生影響,對(duì)于新的功能請(qǐng)求地址,仍然可以訪問。這樣對(duì)于新舊功能,相互之間不會(huì)產(chǎn)生影響,這樣對(duì)于軟件系統(tǒng)的維護(hù)與使用,在兼容原有系統(tǒng)的功能的基礎(chǔ),對(duì)軟件系統(tǒng)實(shí)現(xiàn)持續(xù)的新增和維護(hù)更新,帶來了很大的便利,同時(shí)也給我們的開發(fā)帶來了極大的優(yōu)異[1]。
REST全稱是表述性狀態(tài)轉(zhuǎn)移,那表述是什么意思呢? 其實(shí)代表的就是資源。任何事物,只要有被引用到的價(jià)值,那就可以理解為一個(gè)資源。資源可以是實(shí)體(例如身份證號(hào)碼),也可以是一個(gè)抽象概念(比如價(jià)值多少) 。URI既可以看成是資源的路徑,也可以看成是資源的全名。如果某些信息沒通過URI來表示,那它就不能算是一個(gè)資源, 只能算是資源中的某些信息而已。URI的設(shè)計(jì)應(yīng)該遵循可尋址性原則,具有自描述性,需要在表現(xiàn)形式上給人以直觀上的關(guān)聯(lián)[2]。
RESTful結(jié)構(gòu)必須遵從統(tǒng)一接口規(guī)則。接口規(guī)則需要程序編寫者遵循一定的接口規(guī)范,有著相應(yīng)的約束語(yǔ)法規(guī)則,這樣的約束,既有利于接口資源的統(tǒng)一,同時(shí)對(duì)于編寫者和使用者而言,有規(guī)律可遵循。同時(shí),對(duì)于資源來說,無論是什么樣的資源,都是使用相同的接口進(jìn)行數(shù)據(jù)的查詢和資源的訪問。而且,對(duì)于所有的資源接口來說,都要符合HTTP的請(qǐng)求標(biāo)準(zhǔn)。不能逾越http網(wǎng)絡(luò)傳輸協(xié)議規(guī)范。而對(duì)于Http來說,它包含get,post,put等方法,例如get是安全且冪等性的,post是不安全和不冪等性的,之所以會(huì)產(chǎn)生這種情況,主要是從服務(wù)的狀態(tài)來評(píng)定的,倘若不發(fā)生改變,則是安全的。倘若發(fā)生影響,則是冪等性的。不同方法適用于不同的場(chǎng)景,需要我們?cè)陂_發(fā)過程中根據(jù)具體需求做出相應(yīng)的處理。
(1)HTTP有許多請(qǐng)求方法,put就是其中之一,當(dāng)客戶需要提交數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí),可以通過put請(qǐng)求方法,put方法在發(fā)生請(qǐng)求時(shí),將會(huì)更新數(shù)據(jù),同時(shí)也會(huì)將服務(wù)器的狀態(tài)進(jìn)行相應(yīng)的改變。因?yàn)?,?dāng)我們?cè)诰帉懜禄蛘咛峤粩?shù)據(jù)的接口時(shí),將會(huì)采用到put的請(qǐng)求方式。
(2)我們?cè)陂_發(fā)RESTful接口的時(shí)候,往往可能存在一些頭部參數(shù),或者設(shè)置一些透?jìng)鞯膶傩灾?,頭部參數(shù)可能隱含著真實(shí)的請(qǐng)求路徑或者請(qǐng)求方式,而透?jìng)鲃t是請(qǐng)求url時(shí)具體的請(qǐng)求參數(shù)體,可能是string的格式,也可能是json的格式,這個(gè)需要根據(jù)具體的業(yè)務(wù)需求進(jìn)行確定。
(3)接口統(tǒng)一后仍然可以進(jìn)行方法的擴(kuò)展。但前提條件是拓展的方法必須要符合接口的規(guī)則和請(qǐng)求規(guī)范,不能脫離接口的統(tǒng)一性原則[3]。
(4)雖然我們?cè)陂_發(fā)接口時(shí),需要講究安全性原則。但是在實(shí)際的RESTful的開發(fā)過程中,或多或少的還是產(chǎn)生一些負(fù)面的作用。同時(shí),服務(wù)器在產(chǎn)生源源不斷的請(qǐng)求時(shí),這些負(fù)面的作用還是伴隨著產(chǎn)生,因?yàn)?,開發(fā)人員在設(shè)計(jì)接口時(shí),要盡可能的考慮到該url在請(qǐng)求時(shí)發(fā)生的服務(wù)器奔潰,空指針異常等負(fù)面的影響。
(5)對(duì)于接口的開發(fā)人員來說,需要制定一套統(tǒng)一的請(qǐng)求狀態(tài)碼,一方面來表示請(qǐng)求是否合法,另一方面也可表示該請(qǐng)求成功與否。而對(duì)于這套統(tǒng)一的狀態(tài)碼,需要開發(fā)人員與客戶相互協(xié)調(diào)溝通,以此來達(dá)到資源接口的統(tǒng)一性。同時(shí),這些狀態(tài)碼要盡可能的詳細(xì),通知也要附帶一定的指導(dǎo)意思,這樣既給后續(xù)維護(hù)人員帶來更新維護(hù)上的方面,業(yè)方面客戶進(jìn)行理解使用。
客戶端與服務(wù)端之間其實(shí)傳遞的只是一種資源的描述,而不是將資源進(jìn)行傳遞。比如說,某些文本數(shù)據(jù)的傳遞,我們可以使用json,xml等格式進(jìn)行傳遞,然后再將其中的描述在客戶端與服務(wù)端之間以數(shù)據(jù)流的形式進(jìn)行傳輸,這樣不僅可以使得文本數(shù)據(jù)保持安全性。如果是某些圖片的數(shù)據(jù),圖片資源是無法直接傳輸?shù)?,需要將其描述為流的形式進(jìn)行傳輸,當(dāng)其傳輸?shù)椒?wù)器之后,再進(jìn)行解析為圖片。
資源之間也是需要鏈接起來的,這樣不同資源之間可以相互關(guān)聯(lián)起來,而非獨(dú)立。因此在資源的描述中,需要加入鏈接來引導(dǎo)我們的客戶端。往往資源之間需要相互跳轉(zhuǎn),相互協(xié)調(diào)的。因此在數(shù)據(jù)傳輸?shù)母袷街校枰尤腈溄訉傩?,因此客戶端才?huì)根據(jù)鏈接來進(jìn)行引導(dǎo)[4]。
對(duì)于一個(gè)系統(tǒng)而言,它包含這兩種狀態(tài),一種是應(yīng)用的狀態(tài),另一種是資源的狀態(tài)。應(yīng)用的狀態(tài)指的是軟件系統(tǒng)的狀態(tài),而資源的狀態(tài)指的是資源在請(qǐng)求的過程中,所擁有的狀態(tài)。因此,前者和客戶端有關(guān),后者和服務(wù)器有關(guān)。而且,這二者之間的交互是無狀態(tài)的。并且在每次的請(qǐng)求當(dāng)中,請(qǐng)求體將會(huì)包含我們所需的所有資源數(shù)據(jù)。同時(shí),在實(shí)際的請(qǐng)求過程中,服務(wù)器才會(huì)使用到應(yīng)用的狀態(tài)。這種通信原則有一個(gè)特點(diǎn)就是服務(wù)器和媒介之間可以獨(dú)立的解析資源請(qǐng)求和響應(yīng)。當(dāng)然了,實(shí)際的請(qǐng)求中也會(huì)有違反無狀態(tài)通信規(guī)則的情況,例如利用客戶端上的cookies來記錄某一個(gè)服務(wù)器的會(huì)話請(qǐng)求。
本文從資源的定義、獲取、表述、關(guān)聯(lián)、狀態(tài)變遷等角度, 試圖快速理解RESTful架構(gòu)背后的概念。RESTful架構(gòu)與傳統(tǒng)的RPC、SOAP等方式在理念上有很大的不同,希望本文能對(duì)各位讀者理解REST有所幫助。
[1]陳冠元.軟件工程中的UML建模技術(shù)[J].電子技術(shù)與軟件工程,2018.
[2]劉傳會(huì).基于UML2.0順序圖的高可信實(shí)時(shí)軟件建模技術(shù)研究[A].中國(guó)航空學(xué)會(huì)、中國(guó)航空研究院,2017.
[3]夏志龍.使用UML和Event-B構(gòu)建基于云平臺(tái)的應(yīng)用軟件模型[D].江蘇科技大學(xué),2016.
[4]于麗.基于UML的面向?qū)ο蠼<夹g(shù)研究與應(yīng)用[J].信息與電腦(理論版),2015.