越來越多的人開始意識到,**即軟體,而且是一種新型的軟體。
這種「網際網路軟體」採用客戶端/伺服器模式,建立在分布式體系上,通過網際網路通訊,具有高延時(high latency)、高併發等特點。
**開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網路是兩個不同的領域,很少有交集;軟體開發主要針對單機環境,網路則主要研究系統之前的通訊。網際網路的興起,使得這兩個領域開始融合,現在我們必須考慮,如何開發在網際網路環境中使用的軟體。
restful架構,就是目前最流行的一種網際網路軟體架構。它結構清晰、符合標準、易於理解、擴充套件方便,所以得到越來越多**的採用。
但是,到底什麼是restful架構,並不是乙個容易說清楚的問題。下面,我就談談我理解的restful架構。
rest這個詞,是roy thomas fielding在他2023年的博士**中提出的。
fielding是乙個非常重要的人,它是http協議(1.0版和1.1版)的主要設計者、apache伺服器軟體的作者之一、apache**會的第一任主席。所以,他的這篇**已經發表,就引起了關注,並且立即對網際網路開發產生了深遠的影響。
他這樣介紹**的寫作目的:
"本文研究電腦科學兩大前沿----軟體和網路----的交叉點。長期以來,軟體研究主要關注軟體設計的分類、設計方法的演化,很少客觀地評估不同的設計選擇對系統行為的影響。而相反地,網路研究主要關注系統之間通訊行為的細節、如何改進特定通訊機制的表現,常常忽視了乙個事實,那就是改變應用程式的互動風格比改變互動協議,對整體表現有更大的影響。我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網路為基礎的應用軟體的架構設計,得到乙個功能強、效能好、適宜通訊的架構。"
fielding將他對網際網路軟體的架構原則,定名為rest,即representational state transfer的縮寫。我對這個片語的翻譯是「表現層狀態轉化」。
如果乙個架構符合rest原則,就稱它為restful架構。
要理解restful架構,最好的方法是去理解representational state transfer這個片語到底是什麼意思,它的每乙個詞代表了什麼含義。如果你把這個名稱搞懂,也就不難體會rest是一種什麼樣的設計。
rest的名稱「表現層狀態轉化」中,省略了主語。「表現層」其實指的是「資源」(resource)的「表現層」。
所謂「資源」,就是網路上的乙個實體,或者說是網路上的乙個具體資訊。它可以是一段文字、一張、一首歌曲、一種服務,總之就是乙個具體的實在。你可以用乙個uri(統一資源定位符)指向它。
所謂「上網」,就是網際網路上一系列的「資源」互動,呼叫它的url。
「資源」是一種資訊實體,它可以有多種外在表現形式。我們把「資源」具體呈現出來的形式,叫做它的「表現層」(representational)。
比如,文字可以用txt格式表現,也可以用html格式、xml格式、json格式表現,甚至可以採用二進位制格式;可以用jpeg格式表現,也可以用png格式表現。
uri值代表資源的實體,不代表它的形式。嚴格地講,有些**最後「.html」字尾名是不必要的,因為這個字尾表現格式,屬於「表現層」範疇,而uri應該只代表「資源」的位置。它的具體表現形式,應該再http請求的頭資訊中用accept和content-type欄位指定,這兩個欄位才是對「表現層」的秒數。
訪問乙個**,就代表了客戶端和伺服器的乙個互動過程。在這個過程中,勢必涉及到資料和狀態的變化。
網際網路通訊協議http協議,是乙個無狀態協議。這意味著,所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器發生「狀態轉化」(state transfer)。而這種轉化是建立在表現層之上,所以就是「表現層狀態轉化」。
客戶端用到的手段,只能是http協議。具體來說,就是http協議裡面,四個表示操作的動詞:get、post、put、delete。它們分別對應四種基本操作:get用來獲取資源,post用來新建資源(也可以用於更新資源),put用來更新資源,delete用來刪除資源。
綜合上面的解釋,我們總結一下什麼是restful架構:
(1)、每乙個url代表一種資源;
(2)、客戶端和伺服器之前呢,傳遞這種資源的某種表現層;
(3)、客戶端用過四個http動詞,對伺服器端資源進行操作,實現「表現層狀態轉化」。
restful架構有一些典型的設計誤區。
最常見的一種設計錯誤,就是uri包含動詞。因為「資源」表示一種實體,所以應該是名詞,uri不應該有動詞,動詞應該放在http協議中。
距離來說,某個uri是/posts/show/1,其中show是動詞,這個uri就設計錯了,正確的寫法應該是/posts/1,然後用get方法表示show。
如果某個動作是http動詞表示不了的,你應該把該動作做成一種資源。比如網上匯款,從賬戶1向賬戶2匯款500元,錯誤的url是:
post /accounts/1/transfer/500/to/2正確的寫法是把動詞transfer改成名詞transaction,資源不能是動詞,但是可以是一種服務:
另外設計誤區,就是在uri中加入版本號:
因為不同的版本,可以理解成同一種資源的不同表現形式,所以應該採用同乙個uri。版本號可以在http請求頭資訊的accpet欄位中進行區分。
accept: vnd.example-com.foo+json; version=1.0accept: vnd.example-com.foo+json; version=1.1
accept: vnd.example-com.foo+json; version=2.0
理解RESTful架構
理解restful架構 restful的精闢理解 看url就知道要什麼 看http method就知道幹什麼 看http status code就知道結果如何 rest不是 rest 這個單詞,而是幾個單詞縮寫。但即使那幾個單詞說出來,也無法理解在說什麼 不是要貶低人,是我自己也理解困難 rest描...
理解RESTful架構
1.面向資源是rest最明顯的特徵,即將伺服器上所有提供的事物都抽象成資源 而且每一種資源都是有狀態的。這裡引出了 資源及其狀態 的概念。2.除了設計資源本身,還需設計資源之間的關聯關係,並且通過超連結 在表現層時 才將資源關聯起來。這裡引出了 超文字驅動 3.伺服器的資源通過語義化的api及一組有...
理解RESTful架構
越來越多的人開始意識到,即軟體,而且是一種新型的軟體。這種 網際網路軟體 採用客戶端 伺服器模式,建立在分布式體系上,通過網際網路通訊,具有高延時 high latency 高併發等特點。開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網路是兩個不同的領域,很少有交集 軟體開發主要針對單機環境,...