對於執行在網路上的mis系統而言,處理資料的是整個系統的主要任務,翻開程式我們可以看到,80%以上的**都在處理資料的crud操作。採用一種什麼樣的框架結構,能夠使得處理資料的操作變得簡單且易理解,這是大部分開發者尤其是架構設計者一直以來思考的乙個問題。
rest(representational state transfer)是一種程式設計風格,特別是針對網路應用的設計和開發,採用rest可以顯著降低開發的複雜性,提高系統的可伸縮性。
rest是一種獨特的程式設計風格,與mvc強調的角色分層概念不同,rest強調使用統一的規則來規範對資源的操作,兩者互為補充,相符相成,使用 mvc架構搭配rest程式設計風格構建基於網路的mis系統將在不遠的為未成為主流。本文著重介紹rest程式設計風格的核心規則,並且結合spring mvc描述rest在實際應用中的**形態。
使用rest風格開發web應用程式強調以下幾點規則:
網路上的所有事物都被抽象為資源(resource);
每個資源對應乙個唯一的資源標識(resource identifier);
通過通用的聯結器介面(generic connector inte***ce)對資源進行操作;
對資源的各種操作不會改變資源標識;
所有的操作都是無狀態的(stateless)。
首先,在筆者看來,rest定義中的資源即應用程式所處理的資料。以訂單管理系統為例,訂單資訊就是資料,同樣客戶資訊和產品資訊也是資料,在rest看來這些資料都是資源。
rest強調資源必須有具有唯一名稱和id,名稱用來區分不同資源,id用來定位同類資源中唯一的一條資料。在rest中,這些規則都是通過uri 來描述的。還是以上面的訂單系統為例,我們將訂單資訊名稱設定為order,客戶資訊為customer,貨物資訊為product,那麼就存在幾下的幾 種uri設計:
我們可以看出rest風格uri設計的特點:http://host/context/資源名稱/[資源id]。其中資源名稱是必選項,資源id可省略,省略資源id用來標識一類資源的所有資料。
有了資源和用來標識資源的uri後,rest用聯結器來標識對資源的操作。在這裡,對資源的操作分為查詢/獲取、建立、刪除、修改四種。在網路程式設計環境下,rest用http協議作為聯結器,用http method(請求方法)標識操作型別:
在完成資源和聯結器兩個核心概念的定義後,我們已經可以大體勾勒出rest風格程式設計的基本思路:
抽象和定義系統中的資源;
使用rest風格的uri將請求與資源進行繫結;
使用http請求對資源進行操作;
還用上面提到的訂單系統為例,請看下面的例子:
producttype 服裝
... ...
簡單的說,uri加上http method構成了rest處理資料的核心規則:uri確定了操作的物件,http method則確定了操作的方式。
與傳統處理資料的方式不同,如果不使用rest,那麼操作的物件和操作方式將混合在url設計中,正如首次提出rest概念的roy t. fielding博士所說的:「rest允許我們通過url設計系統」。事實上roy也是web協議的主要設計者,正是在他的參與下完成了http1.1 規範的制定。
站在另乙個角度,rest強調資源(資料)的概念,一切操作圍繞特定資源展開,離開了資源,rest就失去了存在的意義。在這一點上,rest所倡導的思想與時下流行的ajax的程式設計風格有著異曲同工之妙。
ajax強調資料與展現分離,後台應用程式致力於生產資料,前台使用指令碼進行資料的展示。對於資料的組織與傳輸ajax並沒有內建的支援。而 rest強調通過uri將請求與資源進行繫結,如果將rest與ajax技術進行結合,則可以形成有效的互補,我們不妨將上面提到的程式設計思路進行擴充套件,仍 然以獲取id為1的訂單資訊為例:
ajax發起請求:/1;
通過rest風格的uri設計將請求與後台實體進行繫結;
後台實體返回包含產品資訊的json/xml資料;
前台使用指令碼進行資料的展示。
我們用spring mvc來實現上面描述的過程,作為主流的mvc產品,spring mvc天然支援rest程式設計風格,所以使用spring mvc來搭建rest風格的應用程式將變得異常簡單。
spring mvc使用特殊的標註對handler物件進行修飾,使得handler能夠處理rest風格的請求,我們來看幾個例子:
/**
* 按id值獲取訂單資訊
* * @param id
* @return
*/@responsebody
public orderentity getorder(@pathvariable int id)
/** * 按型別查詢貨物資訊
* * @param id
* @return
*/@responsebody
public listgetproductbytype(string type)
/** * 建立訂單資訊
* * @param id
* @return
*/public void createorder(orderentity entity)
/** * 修改訂單資訊
* * @param id
* @return
*/public orderentity updateorder(@pathvariable int id, orderentity entity)
/** * 刪除指定id值的訂單資訊
* * @param id
* @return
*/public void deleteorder(@pathvariable int id)
通過上面的例子可以看出,使用spring mvc編寫rest風格的應用程式是多麼的簡單。
需要我們注意的是,rest要求資源的標識是不變的,也就是說對於特定的資源,無論對這個資源作了什麼樣的操作,資源的id不可以改變。之所以加入 這樣的限制是為了保證uri的一致性。試想如果某個操作在處理過程中改變了資源的標識,那麼為了保證規則的完整性,我們必須付出額外的代價去在其它的處理 中同步這些變化,這在rest中是不可接受的。
另一方面,rest要求針對資源的所有操作必須是無狀態的,uri是確定資源的唯一途徑。如果我們在處理資料的過程中融入了狀態資料,那麼針對同一資源的uri就會出現二義性,這將與rest的定義背道而馳。
使用Spring MVC構建REST風格WEB應用
對於執行在網路上的mis系統而言,處理資料的是整個系統的主要任務,翻開程式我們可以看到,80 以上的 都在處理資料的crud操作。採用一種什麼樣的框架結構,能夠使得處理資料的操作變得簡單且易理解,這是大部分開發者尤其是架構設計者一直以來思考的乙個問題。rest representational st...
re模組使用
import re strdata python is the best language in the world match只能匹配以 開頭的子符串,第乙個引數是正則,第二個引數是需要匹配的字串 res re.match p strdata,re.i re.i引數表示忽略大小寫 res re.m...
RE模組使用
i mport reli re.match d 12821j128j312893j129 match方法,先使用正規表示式,然後傳入待查字串 print li 結果物件 sre.sre match object span 0,5 match 12821 ifli print li.group 獲得資...